Страницы: 1 2 След.
RSS
VBA транспортировать значение по условию.
 
Доброго времени суток!

столкнулся с задачей, решение которой на первый взгляд казалось простым, но солидное количество времени которое было потрачено на поиск решения так и не привело к 100% результату. Поиск на форуме так же не дал положительного результата.
Пример таблицы и желаемого результата во вложении, условия следующие:

1.Данные из колонки оставляем вертикально расположенными при этом удалив дубликаты.
2.Данные из колонки 2 которые находятся напротив колонки 1 транспортируем и удаляем дубликаты.
3.Наконец данные из колонки 3 которые находятся напротив колонки 1 также транспортируем и удаляем дубликаты.

Реальные массивы данных могут быть очень большими.

Заранее спасибо за помощь. !
 
Макрос без оптимизации. (это уже самостоятельно)
Скрытый текст

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Другой вариант - словарь массивов словарей :)
Вывод сделан неоптимально (поячеечно), но некогда, надо убегать
Код
Sub bb()
Dim v(), di As Object, i&, j&, m&, x, y
v = Range("A4", Cells(Rows.Count, "C").End(xlUp)).Value
Set di = CreateObject("scripting.dictionary")
On Error GoTo 1
For i = 1 To UBound(v)
    di(v(i, 1))(0).Item(v(i, 2)) = Empty
    di(v(i, 1))(1).Item(v(i, 3)) = Empty
Next
On Error GoTo 0
Erase v
Worksheets.Add
i = 0
For Each x In di.keys
  i = i + 1
  j = 1
  Cells(i, j) = x
  For Each y In di(x)(0).keys
    j = j + 1
    Cells(i, j) = y
  Next
  For Each y In di(x)(1).keys
    j = j + 1
    Cells(i, j) = y
  Next
Next


Exit Sub

1 If Err = 13 Then 'Type mismatch
    di(v(i, 1)) = Array(CreateObject("scripting.dictionary"), CreateObject("scripting.dictionary"))
    Resume
  Else: Stop
  End If
End Sub
 
Огномное спасибо за помощь. !
 
Дописал: массивный вывод
Скрытый текст

Полумассивный вывод - если будет не хватать памяти на массивный
Скрытый текст
 
Добрый день, я аналитик SQl c VBA ещё не сталкивалась,прошу помощь. Нужен макрос,при том кол-во данных по вертикале и горизонтале не известен. Задача похожа на 1, которая представлена выше. У меня есть Желаемый результат,нужно получить Таблицу. Тоже без дубликатов.
Скрытый текст
 
Yulikolove, здравия. Файл-пример, согласно правил форума. (ознакомьтесь с ними)

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Сбрасываю файл в Excel
 
Не самый оптимальный вариант

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Почти то же самое:
Код
Sub getTable()
    Dim rngHor As Range
    Dim rngVer As Range
    Dim rngOut As Range
    Dim counter As Long
    Dim lngRow As Long
    Dim cell As Range

    Set rngHor = Application.InputBox("Enter Data range", Type:=8)
    Set rngVer = Application.InputBox("Enter Vertical range", Type:=8)
    Set rngOut = Application.InputBox("Enter Output range", Type:=8)

    For Each cell In rngVer
        DoEvents
        rngOut(counter + 1, 1).Resize(rngHor.Columns.Count, 1).Value2 = cell
        rngOut(counter + 1, 2).Resize(rngHor.Columns.Count, 1).Value2 = WorksheetFunction.Transpose(rngHor.Rows(lngRow + 1))
        lngRow = lngRow + 1
        counter = counter + rngHor.Columns.Count
    Next

End Sub
С уважением,
Федор/Все_просто
 
Спасибо огромное,Вам!!!Буду разбирать сейчас.  :D
 
Первый вариант понятен полностью, во втором не пойму,что нужно вводить в окошко "Enter Data range" - ?
"Enter Vertical range" -  выделяю длину данных по вертикале,
"Enter Output range"  - длину данных по горизонтали
 
Enter Data range - введите (укажите) диапазон с данными
Enter Vertical range - ... вертикальный диапазон
Enter Output range - ... выходной диапазон (диапазон вывода)
===
Думаю, так нужно переводить )
 
Лень переключаться на другую раскладку по нескольку раз. Пока переключишься пропадает идея. Ну а так, Юрий правильно расшифровал.:)
С уважением,
Федор/Все_просто
 
Спасибо, вчера нужно было работать с макросом, разобрала)))
Попробую на выходных оптимизировать, чтоб не было пустых ячеек и подпись была одна Inn, Phone.
Если до выходных кто-то сможет помочь-буду благодарна.
Спасибо, Вам, ещё раз.
 
Прилагаю файл,если у кого-то будет возможно свободное время.
Прохожу испытательный срок-каждый день что-то новое.
Заранее благодарна.
Изменено: Yulikolove - 09.09.2015 11:36:31
 
Yulikolove, а в чём проблема самостоятельно написать макрос? (у Вас уже есть примеры написания макроса, осталось только добавить цикл по столбцу с ИН)

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Если бы я понимала VBA))))) А почему по ИНН? По телефонам,наверное. Нужно проверить,где нет телефонов-строку удаляем полностью. И верхушку нужно переделать. Попробую сама конечно.
 
Во!))
Код
Sub Trans()
    Dim rngHor As Range
    Dim rngVer As Range
    Dim rngOut As Range
    Dim counter As Long
    Dim lngRow As Long
    Dim cell As Range
 
    Set rngHor = Application.InputBox("Enter Data range", Type:=8)
    Set rngVer = Application.InputBox("Enter Vertical range", Type:=8)
    Set rngOut = Application.InputBox("Enter Output range", Type:=8)
 
    For Each cell In rngVer
        DoEvents
        rngOut(counter + 1, 1).Resize(rngHor.Columns.Count, 1).Value2 = cell
        rngOut(counter + 1, 2).Resize(rngHor.Columns.Count, 1).Value2 = WorksheetFunction.Transpose(rngHor.Rows(lngRow + 1))
        lngRow = lngRow + 1
        counter = counter + rngHor.Columns.Count
    Next
    
Const lCol As Long = 2 'Номер слобца,где ищем пустые ячейки
Const lFirstRow As Long = 1 'Номер строки с которой начинаем отчёт
Dim li As Long, lLastRow As Long, lCalc As Long
With Application
'Для ускорения выполнения Отключаем обновление экрна и пересчет формул
.ScreenUpdating = 0: lCalc = .Calculation: .Calculation = xlManual 'идем циклом по всем ячейкам столбца lCol
For li = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1 To lFirstRow Step -1
'Если ячейка пустая - удаляем строку.
If Cells(li, lCol) = "" Then Rows(li).Delete
Next li
'возвращаем обновление экрна и пересчет формул
.ScreenUpdating = 1: .Calculation = lCalc
End With
End Sub
 
Yulikolove, код следует оформлять тегом - посмотрите #10. Ищите такую кнопку: <...>
 
Прилагаю файл
 
Yulikolove, Вам вряд ли кто будет помогать, пока не внемлите замечанию модератора.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Код
Sub Trans() 
Dim rngHor As Range 
Dim rngVer As Range 
Dim rngOut As Range 
Dim counter As Long 
Dim lngRow As Long 
Dim cell As Range 

Set rngHor = Application.InputBox("Enter Data range", Type:=8) 
Set rngVer = Application.InputBox("Enter Vertical range", Type:=8) 
Set rngOut = Application.InputBox("Enter Output range", Type:=8) 

For Each cell In rngVer 
DoEvents 
rngOut(counter + 1, 1).Resize(rngHor.Columns.Count, 1).Value2 = cell 
rngOut(counter + 1, 2).Resize(rngHor.Columns.Count, 1).Value2 = WorksheetFunction.Transpose(rngHor.Rows(lngRow + 1)) 
lngRow = lngRow + 1 
counter = counter + rngHor.Columns.Count 
Next 

Const lCol As Long = 2 'Номер слобца,где ищем пустые ячейки 
Const lFirstRow As Long = 1 'Номер строки с которой начинаем отчёт 
Dim li As Long, lLastRow As Long, lCalc As Long 
With Application 
'Для ускорения выполнения Отключаем обновление экрна и пересчет формул 
.ScreenUpdating = 0: lCalc = .Calculation: .Calculation = xlManual 'идем циклом по всем ячейкам столбца lCol 
For li = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1 To lFirstRow Step -1 
'Если ячейка пустая - удаляем строку. 
If Cells(li, lCol) = "" Then Rows(li).Delete 
Next li 
'возвращаем обновление экрна и пересчет формул 
.ScreenUpdating = 1: .Calculation = lCalc 
End With 
End Sub

Сори, я не очень внимательная :oops:
 
Yulikolove, т.е. Вы решили свой вопрос?

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Не совсем, макрос работает, но игнорирует запятую.
Скобки в начале и в конце проставляются. А вот запятая между сцепленными данными нет.
Сброшу макрос.
Может запятую как-то по-другому выделять нужно?
Код
Sub Слеить_сцепить()
  For r = ActiveCell.Row To ActiveCell.End(xlDown).Row
    Cells(r, 1) = "(" & Cells(r, 1) & "," & Cells(r, 2) & ")"
    Range(Cells(r, 2), Cells(r, 2)).ClearContents
    Range(Cells(r, 1), Cells(r, 2)).Merge
  Next
End Sub
 
Yulikolove, попробуйте так:
Скрытый текст

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Спасибо! Работает.
Один знак-всё меняет! :D
 
Добрый день, я уже сама от своего макроса устала)))
Добавила я 3 столбец. Эксель матерится))
Смогла сама переделать-росту!
Код
Sub Сцеплять()
    For r = ActiveCell.Row To ActiveCell.End(xlDown).Row
    Cells(r, 1) = "'(" & Cells(r, 1) & "," & Cells(r, 2) & "," & Cells(r, 3) & ")"
    Range(Cells(r, 3), Cells(r, 3)).ClearContents
    Application.DisplayAlerts = False
    Range(Cells(r, 1), Cells(r, 3)).Merge
    Application.DisplayAlerts = True
  Next
End Sub
Изменено: Yulikolove - 11.09.2015 12:56:29
 
А зачем в цикле кучу раз включать/отключать Application.DisplayAlerts?
 
Доброе утро!Юрий. Как  я читала,чтоб не обновлялись формулы...вроде.
Работал у меня этот скрипт,никаких багов не было. Теперь выдаёт "Runtime error 1004: application-defined or object-defined error".
В этой строке rngOut(counter + 1, 1).Resize(rngHor.Columns.Count, 1).Value2 = cell.
С типом значений связано.
Почему так получается,ведь до этого работал.
И как убрать эту ошибку?
Страницы: 1 2 След.
Наверх