VBA Array Manipulation - PullRequest
       23

VBA Array Manipulation

0 голосов
/ 07 декабря 2011

Я нашел макрос (любезно предоставленный Джерри Бокером), который разбивает один лист на множество на основе уникальных значений в данном столбце.Это прекрасно работает.Однако ...

Клиент предоставил рабочий лист в другом формате, который требует некоторого мягкого массажа, чтобы получить нужный нам формат.

Во-первых, позвольте мне показать вам фрагмент кода JB:

MyArr = Application.WorksheetFunction.Transpose _
    (ws.Columns(iCol).SpecialCells(xlCellTypeConstants))

Из того, что я могу сказать (и я полный новичок VB, так что я знаю .. ??), это заполняет массив с выбранными значениями строки

Иэто:

For Itm = 2 To UBound(MyArr)

    ...(code removed)

    ws.Range("A" & TitleRow & ":A" & LR).EntireRow.Copy _
        Sheets(MyArr(Itm) & "").Range("A1")


    ...(code removed)

Next Itm

... кажется, что делает копирование.

Хорошо.... пока хорошо.

Проблема в том, что мне нужно добавить шаг в процесс.Это будет сложно объяснить.Пожалуйста, потерпите меня ...

Строка заголовка - строка 1

Данные начинаются со строки 2

Каждая строка имеет 9 столбцов:

colA: идентификатор

colB-colD: значения x, y, z (для верхней части элемента)

colE-colG: значения x, y, z (для нижней части элемента)

colH и colI: можно игнорировать

Эти значения x, y и z используются для определения точек, которые используются для построения линий в программе трехмерного моделирования.Каждая строка на рабочем листе фактически определяет линию (ну ... начальная точка и конечная точка - «верх» и «низ»). К сожалению, полученные нами данные (рабочий лист) определяют два набора данных для каждой строки - обаимея одинаковую начальную точку, но с разными конечными точками.Другими словами, начиная со строк 3 и 4, данные в столбцах BD одинаковы для обеих строк.Это относится к строкам 5 и 6, 7 и 8 и т. Д.

Поскольку все, что нам нужно, это набор ТОЧЕК данных, мы можем смело использовать значения из столбцов EG.
ОДНАКО ... и этоВот где мне нужна помощь ... Нам нужно, чтобы первая строка вновь созданного рабочего листа начиналась со значений из строки 2, столбцы BD.(т.е. мы можем использовать конечные точки в качестве наших координат, но нам все еще нужна первая начальная точка) Все остальное в порядке, как оно есть.

Например:

Исходные данные:

   | A  |   B   |   C   |   D   |     E    |     F    |     G    |
 1 | id | x-top | y-top | z-top | x-bottom | y-bottom | z-bottom |
 2 | H1 | 101.2 | 0.525 | 54.25 |  110.25  |  0.625   |  56.75   |
 3 | H1 | 110.25| 0.625 | 56.75 |  121.35  |  2.125   |  62.65   |
 4 | H1 | 110.25| 0.625 | 56.75 |  134.85  |  3.725   |  64.125  |  B,C,D same as row 3
 5 | H1 | 134.85| 3.725 | 64.125|  141.25  |  4.225   |  66.75   |
 6 | H1 | 134.85| 3.725 | 64.125|  148.85  |  5.355   |  69.85   |  B,C,D same as row 5

Что мне нужно:

   | A  |   B   |   C   |   D   |     E    |     F    |     G    |
 1 | id | x-top | y-top | z-top | x-bottom | y-bottom | z-bottom |
 2 | H1 |       |       |       |  101.2   |  0.525   |  54.25   |
 3 | H1 | 101.2 | 0.525 | 54.25 |  110.25  |  0.625   |  56.75   |
 4 | H1 | 110.25| 0.625 | 56.75 |  121.35  |  2.125   |  62.65   |
 5 | H1 | 110.25| 0.625 | 56.75 |  134.85  |  3.725   |  64.125  |
 6 | H1 | 134.85| 3.725 | 64.125|  141.25  |  4.225   |  66.75   |
 7 | H1 | 134.85| 3.725 | 64.125|  148.85  |  5.355   |  69.85   |

Итак ... Какой лучший способ сделать это?Могу ли я добавить в существующий макрос для выполнения этой операции?Если это так, лучше изменить массив?... лучше изменить процедуру копирования?... и как ??

Заранее спасибо за помощь и, пожалуйста, не предлагайте делать это вручную.Есть более 70 000 строк для разбора!

Если вам нужна дополнительная информация, дайте мне знать!

1 Ответ

0 голосов
/ 08 февраля 2012

Полный макрос доступен бесплатно для всех на в этом месте

Чтобы достичь ваших точек подключения, эти дополнения должны сделать это:

For Itm = 2 To UBound(MyArr)

    ...(code removed)

    ws.Range("A" & TitleRow & ":A" & LR).EntireRow.Copy _
      Sheets(MyArr(Itm) & "").Range("A1")
    Sheets(MyArr(Itm) & "").Rows(2).Insert xlShiftDown
    Sheets(MyArr(Itm) & "").Range("E2").Resize(, 3).Value = Sheets(MyArr(Itm) & "").Range("B3").Resize(, 3).Value

    ...(code removed)

Next Itm
...