VBA: скопируйте несколько столбцов с листа в один столбец с другого листа

#vba #excel

#vba #excel

Вопрос:

У меня есть несколько столбцов с определенным расстоянием между ними, и я хочу скопировать все данные в один столбец.

У меня есть переменная n=29 .

Расстояние между столбцами всегда равно 9. общее количество столбцов n*(9 1)=290 соответствует количеству столбцов "KD"

Лист с указанными ниже данными называется "Importat"

  |  B  |....|  L  |....|  V  |...| AF |..until.. |  KD  |
---------------------------------------------------------
1|
2|  10 |....| 79  |....| 21  |...| 41 |..........|  22  |
3|  13 |....| 55  |....| 51  |...|    |..........|  56  |
4|  16 |....|     |....|     |...|    |..........|  67  |
  

И результаты должны быть такими в sheet "COD DATA"

   |  K  |
 ---------
 1|     |
 2| 10  |
 3| 13  |
 4| 16  |
 5| 79  |
 6| 55  |
 7| 21  |
 8| 51  |
 9| 41  |
.......  
 x| 22  |
 y| 56  |
 z| 67  |
  

Любой совет, как я могу это сделать?

Комментарии:

1. Что вы уже пробовали? вы могли бы сделать это с помощью простого подраздела, но хотели бы посмотреть, что вы уже пробовали

2. Я пробовал, когда я копирую данные из столбцов .xml, witch открывается один за другим, но безуспешно. Если я вставлю запрос, вы не поймете, потому что у меня много переменных. Я не хочу, чтобы весь запрос выполнялся вами, все, что я хочу, это подсказка … Спасибо

3. Кстати, это не так просто, как кажется

4. Чего я не понимаю в вашем желаемом результате, так это того, что у вас есть все в 1 строке, но первые 9 совпадают с числами, которые, как я думал, были номерами строк, но затем это переходит в x y z. Какие данные заполняют первый столбец?

Ответ №1:

Возможно, я неправильно понял ваш вопрос, но, насколько я понимаю, у вас есть данные на Importat листе в рабочей книге. Данные находятся в столбцах, а столбцы всегда разделены 9 столбцами (вплоть до столбца KD ). Ниже приведен один из подходов, который вы можете использовать:

 Sub GetDataFromImportatSheet()

    Dim oIWS As Worksheet: Set oIWS = ThisWorkbook.Worksheets("Importat")
    Dim oCWS As Worksheet: Set oCWS = ThisWorkbook.Worksheets("COD DATA")
    Dim intLastColumn As Integer: intLastColumn = oIWS.Cells(2, oIWS.Columns.Count).End(xlToLeft).Column
    Dim intLastRow As Integer
    Dim intColCounter As Integer
    Dim intCurRow As Integer
    Dim intCWSRow As Integer

    intCWSRow = 0

    For intColCounter = 2 To intLastColumn Step 9

        intLastRow = oIWS.Cells(oIWS.Rows.Count, intColCounter).End(xlUp).Row

        For intCurRow = 1 To intLastRow

            If Len(Trim(oIWS.Cells(intCurRow, intColCounter))) <> 0 Then

                intCWSRow = intCWSRow   1
                oCWS.Cells(intCWSRow, "J").Value = intCWSRow
                oCWS.Cells(intCWSRow, "K").Value = oIWS.Cells(intCurRow, intColCounter)

            End If

        Next

    Next

End Sub
  

Комментарии:

1. Я согласен с @ Thomas, ваши столбцы не соответствуют вашему требованию о разделении на 9 столбцов, но я проигнорировал ваш пример и выбрал «разделенные на 9 столбцов»

2. 1 ваш код выглядит хорошо. I вам следует использовать For intColCounter = 2 To intLastColumn Step 9 вместо intColCounter = intColCounter 8 . Я лично использую однобуквенные переменные для счетчиков и индексов. Когда я вижу их, я знаю, что это счетчики. Если вы получите изменения, ознакомьтесь: Рефакторированный код, который я использую Target , немного бестолковый, это может ухудшить читаемость кода.

3. @ThomasInzina вы абсолютно правы. Совершенно забыл о Step опции: обновить код в соответствии с вашим spot. Не могу перейти по ссылке на код рефакторинга с работы, но посмотрю на нее сегодня вечером

Ответ №2:

Данные вашего примера не соответствуют согласованному шаблону.

введите описание изображения здесь

 Dim y As Long

For y = 2 To 300 Step 10
    Debug.Print Split(Columns(y).Address(False, False), ":")(0); ",";
Next
  

Ответ №3:

Что вы хотите сделать, так это изменить форму ваших данных. Я создал сложный макрос, чтобы сделать это двумя способами: список -> таблица и таблица -> список. Проверьте это: http://amitkohli.com/change-lists-into-tables-and-tables-into-lists /

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