#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 столбцов друг от друга.