#excel #vba
Вопрос:
У меня есть 2 листа Excel : один, содержащий исходные данные, и один, содержащий данные о цели. я создал форму пользователя, содержащую выпадающие списки(выпадающие списки)и кнопку импорта .
существуют комбинированные поля, содержащие имена первой строки исходного листа, и другие комбинированные поля, содержащие имена первой строки целевого листа.
я хочу сравнить имена в выпадающих списках ( имена источника и цели) и сопоставить их , если они равны, чем когда я нажимаю кнопку «Импорт», все в исходном листе excel будет импортировано в лист excel цели в нужном месте. как я могу это сделать ?
Я ПОПРОБОВАЛ ЭТОТ КОД
dim sh =ThisWorkbook.Sheets("sourcedata")
dim sh2= ThisWorkbook.Sheets("goaldata")
dim i,j as integer
for i = 1 to Application.WorksheetFunction.CountA(sh.Range("1:1"))
for j = 1 to Application.WorksheetFunction.CountA(sh2.Range("1:1"))
if sh.cells(1,i).value = sh2.cells(1,j).value then
Me.comboBox1.value = sh.cells(1,i)
Me.comboBox2.value = sh2.cells(1,j)
Me.comboBox3.value = sh.cells(1,i)
Me.comboBox4.value = sh.cells(1,j)
end if
next
next
end sub
проблема в том, что я обычно получаю одно и то же значение во всех комбинациях.
я хочу, чтобы во всех выпадающих списках были указаны имена строк на обоих листах.
например , у меня есть имена строк исходного листа : Дата, событие и место, имена строк в целевом листе : только дата и событие, например : в combobox1.значение= Дата также должно быть в comboBox2.значение = Дата (поскольку дата существует на обоих листах). combBox3.значение = Событие и поле 4. значение должно быть событием
Я хочу вставить поле 5.значение = место ( поле 5 содержит имена, которые существуют только на одном листе, и они не совпадают )
Какая-нибудь помощь?
Комментарии:
1. Вы должны опубликовать код, который вы пробовали.
2. я опубликовал код. у тебя есть какие-нибудь идеи?
Ответ №1:
Я думаю, что я понял часть 3 списка, но не полностью часть «какие данные следует скопировать», поэтому давайте уже перейдем к части списка.
Некоторые заметки о вашем коде:
- Когда вы не упоминаете тип данных в вашем dim, переменные по умолчанию указаны в типе варианта=>, например, dim i =>> совпадает с dim i как вариант. хотя это не всегда проблема, это может привести к неожиданному поведению;
- «combobox.значение» предназначено для получения выбранного значения в поле «Комбинация», а не для добавления в него элементов. Смотрю на ваш desc. и код, я думаю, вы намеревались добавить элементы.
Итак, ниже приводится пересмотренная версия, основанная на моих предположениях. вместо того, чтобы использовать «добавить ..элемент», я просто назначил ячейки листа массивам, поскольку затем мы можем манипулировать ими непосредственно в памяти, позволяя выполнять такие операции, как сравнение, копирование и т. Д., Намного быстрее.
Option Explicit
Sub UserForm_Initialize()
Dim arr, arr2
arr = Sheet1.Range("A1:c1").Value2
Me.ComboBox1.List = Application.WorksheetFunction.Transpose(arr)
arr2 = Sheet2.Range("A1:c1").Value2
Me.ComboBox2.List = Application.WorksheetFunction.Transpose(arr2)
Dim i As Long, arr3, ii As Long: ii = 1
ReDim arr3(1 To 1, 1 To UBound(arr, 2))
For i = 1 To UBound(arr, 2)
If arr(1, i) <> arr2(1, i) Then
arr3(1, ii) = arr(1, i)
ii = ii 1
End If
Next i
Me.ComboBox3.List = Application.WorksheetFunction.Transpose(arr3)
End Sub
Взгляните на это и дайте мне знать, как все прошло.