Страницы: 1
RSS
Сцепить в текст несколько числовых значений с их единицами измерений
 
Уважаемые Знатоки, помогите с помощью VBA сцепить значения из таблицы такого формата:
=ТЕКСТ(Лист2!B2;"# ##0,0")&"м.п.; "&ТЕКСТ(Лист2!B3;"# ##0,0")&"м.п.; "&ТЕКСТ(Лист2!B4;"# ##0,0")&"м.п.; "&ТЕКСТ(Лист2!B5;"# ##0,0")&"м.п. "
На листе Лист2 в столбце B есть определенные числовые значения. Их может быть одно и более для оной сцепки. (Сцепка 1 - четыре значения)
Сцепка 2 - два, Сцепка 3 - четыре. Плюс -  в каждой сцепки свои текстовые значения - м.п., шт., и т.д.
Т.е. - при вводе в столбец В значения и столбец С единицы измерения оно занеслось в строку С3. При добавлении этой связки (или по цвету шрифта, или по цвету заливки ячейки)(Или ещё по какому признаку!?) эти значения сцеплялись в одну строку через разделитель ;.
С Выше приведённой формулой НУ ОЧЕНЬ не удобно работать.
 
1. создаёте столбец для сцепки по строке: ТЕКСТ(ячейка;"# ##0,0")&"м.п.
2. сцепляте эти строки по критерию (ЗНАЧЕНИЕ, а НЕ цвет) с помощью готовой UDF
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) [►Кошелёк и контакты◄]
 
Код
=ОБЪЕДИНИТЬ(ИНДЕКС(Лист2!C:C;НАИМЕНЬШИЙ(ЕСЛИ(Лист2!$C$2:$C$13<>Лист2!$C$1:$C$12;СТРОКА(Лист2!$C$2:$C$13));СТРОКА(D1)));1;ИНДЕКС(Лист2!B:B;НАИМЕНЬШИЙ(ЕСЛИ(Лист2!$C$2:$C$13<>Лист2!$C$1:$C$12;СТРОКА(Лист2!$C$2:$C$13));СТРОКА(D1))):ИНДЕКС(Лист2!B:B;НАИМЕНЬШИЙ(ЕСЛИ(Лист2!$C$2:$C$13<>Лист2!$C$1:$C$12;СТРОКА(Лист2!$C$2:$C$13));СТРОКА(D2))-1)) & ИНДЕКС(Лист2!C:C;НАИМЕНЬШИЙ(ЕСЛИ(Лист2!$C$2:$C$13<>Лист2!$C$1:$C$12;СТРОКА(Лист2!$C$2:$C$13));СТРОКА(D1)))
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, спасибо, но хотелось уйти от формул. Очень высока вероятность ошибки при протягивании.
Вариант выше сейчас смотрю. Он, мне кажется, лучше.
 
Код
let
    from = Excel.CurrentWorkbook(){[Name="TD"]}[Content],
    to = Table.Group(   from, 
                        "Column2", 
                        {"Сцепка", each Text.Combine(List.Transform(List.Zip({[Column1],[Column2]}),(x)=>Number.ToText(x{0},"0.0")&x{1}),"; ")},
                        GroupKind.Local,
                        (s,c)=>Number.From(c<>s)
                        )
in
    to
Каждому For свой Next
 
PITBY, пусть будет вариант запуска кнопкой.
Цитата

Или ещё по какому признаку!?
сделал признак типа группы...т.к. цвет так себе вариант...
Код
Sub mrshkei()
    Dim arr, arr2, i As Long, n As Long, sh As Worksheet, sh2 As Worksheet, lr As Long, col As New Collection
    Set sh = Worksheets("Лист1"): Set sh2 = Worksheets("Лист2")
    lr = sh2.Cells(Rows.Count, 1).End(xlUp).Row
    arr = sh2.Range("A2:C" & lr)
    For i = LBound(arr) To UBound(arr)
        On Error Resume Next
        col.Add arr(i, 1), CStr(arr(i, 1))
    Next i
    ReDim arr2(1 To col.Count, 1 To 1): k = 1
    For i = 1 To col.Count
    For n = LBound(arr) To UBound(arr)
        If col(i) = arr(n, 1) Then
        If arr2(i, 1) = Empty Then
            arr2(i, 1) = Format(arr(n, 2), "0.0") & " " & arr(n, 3)
        Else
            arr2(i, 1) = arr2(i, 1) & "; " & Format(arr(n, 2), "0.0") & " " & arr(n, 3)
        End If
        End If
    Next n
    Next i
    sh.Columns(3).ClearContents
    sh.Range("C3").Resize(UBound(arr2), 1) = arr2
End Sub
Не бойтесь совершенства. Вам его не достичь.
 
Цитата
PITBY написал:
но хотелось уйти от формул.
решили перейти на темную сторону)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
:D  Да нет! Я уже давно на "той" стороне. Просто, не силён. Года не те :(  всё запомнить. А с примерами можно и побороться.

Цитата
Mershik написал: сделал признак типа группы...т.к. цвет так себе вариант...
Спасибо за пример! Он отлично подходит.

Цитата
Jack Famous написал: с помощью  готовой UDF
Очень хороший вариант, но немного не то. Я выше писал, что нужно вставить значение + ед. измерения.
Пример уважаемого Mershik подходит более всего, но функция была бы лучше.
Чтобы 1-ю группу вставить в нужную ячейку, 2-ю - во вторую нужную, и т.д.
Буду пытаться сам из массива выбрать данные и вставить в нужные ячейки.

Спасибо всем, что оперативно откликнулись!
И куча примеров в придачу для изучения.
PLANETAEXCEL - СУПЕР!!!
 
PQ чем не устроил?
Каждому For свой Next
 
PITBY, можно ДОПОЛНИТЬ сообщение, а не множить очередь
 
Цитата
PITBY написал:
но функция была бы лучше.
например так, только предположил что группы всегда левее от нужных данных...
Код
Public Function comb_group(rng As Range, cell As Range, d As String)
For Each cel In rng
    If cel = cell Then
    If comb_group = "" Then
        comb_group = Format(cel.Offset(0, 1), "0.0") & " " & cel.Offset(0, 2)
    Else
        comb_group = comb_group & d & Format(cel.Offset(0, 1), "0.0") & " " & cel.Offset(0, 2)
    End If
    End If
Next cel
End Function
Не бойтесь совершенства. Вам его не достичь.
 
Цитата
PITBY: немного не то…нужно вставить значение + ед. измерения…функция была бы лучше
я вам предложил решение с помощью готовой функции и доп. столбца с простой формулой сцепки — что не понравилось?
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) [►Кошелёк и контакты◄]
 
Цитата
PITBY написал:
И куча примеров в придачу для изучения.
и вдогонку еще один простой и рабоче-крестьянский
=IF(C1=C2;D1&"; ";"")&TEXT(B2;"0,0")& " "&C2
и
=IF(C2<>C3;D2;"")
остальное дело техники.
По вопросам из тем форума, личку не читаю.
 
Цитата
Mershik написал:
например так, только предположил что группы всегда левее от нужных данных...
Не могли бы прислать пример. Что-то всё ЗНАЧ выпадает при разных вариантах выбора данных. :(  
Изменено: PITBY - 05.05.2021 10:27:23
 
Цитата
Jack Famous написал:
я вам предложил решение с помощью готовой функции и доп. столбца с простой формулой сцепки — что не понравилось?
Функция Уважаемого Николая Павлова очень хороша, но сцепляет только значения.
Поэтому, немного не подходит.  
 
Цитата
PITBY: Функция Уважаемого Николая Павлова
мимо
Цитата
PITBY: сцепляет только значения
а вы хотите звуки сцепить? Если вы имеете ввиду КРИТЕРИЙ для сцепки в виде цвета, а не значения, то 1. это легко поправить в коде и 2. это очень неправильный подход, который в будущем не раз вас подведёт
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) [►Кошелёк и контакты◄]
 
Цитата
PITBY написал:
Не могли бы прислать пример.
Не бойтесь совершенства. Вам его не достичь.
 
Цитата
БМВ написал:
и вдогонку еще один простой и рабоче-крестьянский=IF(C1=C2;D1&"; ";"")&TEXT(B2;"0,0")& " "&C2и=IF(C2<>C3;D2;"")остальное дело техники.
Уважаемый БМВ, огромное спасибо за свой вариант! Совершенству нет предела.
Уже и растерялся от такого изобилия примеров.
Цитата
Jack Famous написал:
а вы хотите звуки сцепить? Если вы имеете ввиду КРИТЕРИЙ для сцепки в виде цвета, а не значения, то 1. это легко поправить в коде и 2. это очень неправильный подход, который в будущем не раз вас подведёт
1. Не цвет сцепить! это понятно. А значения и ед. измерения.
2. Изучал уже и модернизацию UDF и для такого варианта.
Вот только вариант Mershik для меня подходит более всего. С функцией только не получается пока. Где-то не вникаю.
Изменено: PITBY - 05.05.2021 10:48:01
 
Цитата
PITBY написал:
С функцией только не получается пока. Где-то не вникаю.
что не получается? у Вас же даже есть пример
Не бойтесь совершенства. Вам его не достичь.
 
и всё-таки чем не устроил PQ? код простой, результат строго по примеру...
Каждому For свой Next
 
Цитата
buchlotnik написал:  чем не устроил PQ?
Со всем уважением к PQ - не тяну я его. Не понимаю. Как не жаль. Пробовал освоить, но самостоятельно не получается.

Цитата
Mershik написал: что не получается? у Вас же даже есть пример
Это я написал чуть позже Вашего примера. Сейчас проверяю на реальном файле. Отпишусь обязательно.
Подскажите про: rng, rng2, cell и d. пожалуйста. И в примере функции, я так понял, в левом столбце где будут выводиться значения, необходимо ставить значения групп?
Изменено: PITBY - 05.05.2021 11:26:40
 
Цитата
PITBY написал:
rng2
удалил - это другой макрос был Вам он не нужен.
rng - это диапазон с группами
cell - ячейка где указана группа для которой будет склейка
d - вид разделителя
Цитата
И в примере функции, я так понял, в левом столбце где будут выводиться значения, необходимо ставить значения групп?
ну что бы определить для какой группы относится и что склеивать
Изменено: Mershik - 05.05.2021 12:03:52
Не бойтесь совершенства. Вам его не достичь.
 
Цитата
Mershik написал:
ну что бы определить для какой группы относится и что склеивать
А нельзя группы указывать на втором листе в столбце А?
У меня в реальной таблице только на Листе1 есть свободная ячейка для вставки данных.
А сама база на другом листе. Как в примере.

Уважаемый Mershik! Спасибо огромное. Всё получилось так как надо.
Спасибо всем за решение вопросов.
Тема закрыта.
Изменено: PITBY - 05.05.2021 15:06:39
Страницы: 1
Читают тему (гостей: 1)
Наверх