Создать несколько столбцов на одном листе из 1 столбца на другом с логикой - PullRequest
0 голосов
/ 17 сентября 2010

Я новичок в VBA и изо всех сил пытаюсь сделать эту работу. Мне нужен макрос, который будет обрабатывать каждую ячейку \ столбец на Sheet1 и помещать результаты на Sheet2. Я уверен, что это довольно легко для тех, кто более опытен с VB-кодом. Он содержит много столбцов ..

Каждый раз, когда мы встречаем или пустую ячейку, мы заполняем ячейку -999 (см. Пример на Sheet2) в первом столбце, который содержит "0-2". Затем мы создаем 2 новых столбца и заполняем их 0 в первом столбце и 2 во втором столбце (см. Пример в Sheet2). Если значение найдено только на одной стороне, мы заполняем обе стороны одним и тем же числом.

Поскольку каждый столбец обрабатывается в Sheet1 и

Лист1:


A               B
Column1         Column2
Title           Title2
0–2             0–4
3               —
—               5
—               
—               —
10–23           11—29

И результаты должны выглядеть следующим образом на Листе 2

Лист2


A          B            C            D
Column1    Column1      Column2      Column2   
Title-A    Title-B      Title-A      Title-B
0          2            0            4
3          3            -999         -999
-999       -999         5            5
-999       -999         -999        -999
—999       -999         -999        -999
10         23           11           29

Ответы [ 2 ]

1 голос
/ 17 сентября 2010

Хорошо, ваша задача в основном состоит из нескольких частей: 1 - Обход листа с помощью интеллектуальной логики 2 - Разделение 3 - Размещение данных в новой ячейке

Это не доказано для работы, но это должно дать вамбоеприпасы для достижения вашей цели с небольшими усилиями.

Sub mySub()
  dim i,j,dummy,dummy2, blankCounter
  i=1
  j=1
  blankCounter=0
  '@@@@@@Section1
  do while ThisWorkbook.Worksheets(1).Cells(1, j)<>""
  do while blankCounter<=5
        if ThisWorkbook.Worksheets(1).Cells(i, j)=""
          blankCounter=blankCounter+1
        else
        '@@@@@@Section2
       dummy=Split(ThisWorkbook.Worksheets(1).Cells(i, j),"—")
       for k=0 to Ubound(dummy)
        ThisWorkbook.Worksheets(2).Cells(i, j+k)=dummy(k)
       next k
        end if
    i=i+1
  loop
                    blankCounter=0
        j=j+1
  loop


end Sub

хорошо, на английском языке.Первый раздел рассматривает эту книгу («это» обычно встречается в Java, но это более ощутимый пример такой логики).В этой книге посмотрите мой первый лист.В этом рабочем листе давайте посмотрим на col1, row1.Теперь мы будем зацикливать строки и продолжать, пока они не станут пустыми, проделать то же самое со столбцами.В основном это позволит найти размеры вашей матрицы (данных).

Хорошо, теперь, когда мы можем пройти книгу, мы находимся на полпути.

Теперь вы познакомитесь с функциональностью разделения вVBA, который также существует практически на каждом языке.Split ищет что-то в вашей строке и разбивает вашу строку по аргументу, который вы предоставляете.Пустышка будет содержать любые возвращаемые значения.Размер манекена неизвестен, поэтому мы не должны жестко его кодировать, иначе он сломается, когда разделителя нет.

При этом мы сейчас вводим Ubound.Ubound - это функциональность, которая определяет размер вашего массива.Обратите внимание: если Ubound возвращает 1, это означает, что у вас есть одно значение.Массивы автоматически индексируются в 0, поэтому вы должны помнить об этом, а не циклически повторять от 1 до Ubound, это приведет к ошибке и также приведет к неправильному коду.

Хорошо, хорошо, что теперь мы можем проходить наш массив и нашу книгунам просто нужно поместить эти значения в нужные ячейки.var k должен быть в состоянии сделать это для вас.

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

1 голос
/ 17 сентября 2010

Вам не нужен VBA для этого.Все это можно сделать с помощью функции if.

В столбце 1 будет использоваться что-то вроде:

=IF(ISNUMBER(Sheet1!A2),Sheet1!A2,IF(OR(Sheet1!A2="-",ISBLANK(Sheet1!A2)),-999,LEFT(Sheet1!A2,1)))

В столбце 2 будет использоваться что-то вроде:

=IF(ISNUMBER(Sheet1!A2),Sheet1!A2,IF(OR(Sheet1!A2="-",ISBLANK(Sheet1!A2)),-999,RIGHT(Sheet1!A2,1)))

3 и4 будет использоваться так же, как 1 и 2, только что сдвинутые по столбцу.

...