У меня есть три столбца A B и C. В некоторых случаях значение имеет только B. В приведенном ниже примере следует рассматривать только строки 2 и 4, а затем в зависимости от их значения соответствующей ячейке в столбце D присваивается определенное значение (соответствующее двум массивам ниже).
A B C D
1 x y z
2 b 2
3 t v
4 e 5
5 g h i
Я не уверен, что это лучший подход для этого. Я объявил нужные массивы, но не знаю, как выполнить условие "если ячейка в A и ячейка в C пусты...".
Dim Kol() As Variant: Kol = VBA.Array(1,2,3) ' I don't know if it makes sense to include columns A and C here
Dim Faelle() As Variant: Faelle = VBA.Array( _
"a", "b", "c", "d", "e")
Dim Werte() As Variant: Werte = VBA.Array( _
"1", "2", "3", "4", "5")
@JosephC Я только что понял, что выбрал неправильные значения для примера. На самом деле значения не похожи на символы и целые числа, соответствующие номерам строк. И я должен использовать VBA, и я думаю, что массивы предпочтительнее, так как лист может достигать 2k строк
"присваивается определенное значение" ничего не значит. Ваш псевдокод, не относящийся к приведенному выше примеру, тоже ничего не проясняет. Итак, если вам действительно нужна помощь, вы должны отредактировать свой вопрос и попытаться четко объяснить словами, ЧТО ВЫ ПЫТАЕТЕСЬ ДОСТИЧЬ.
@FaneDuru значения включены в массив.
Пожалуйста отредактируйте свой вопрос, чтобы уточнить его
Какие «ценности» включены? Вы показываете 2D-массив, вы говорите о столбцах дерева (A, B, C) и показываете кусок кода с 1D-массивами, каждый из 5 и 3 элементов. Откуда вы извлекли Array(1,2,3)
, Array( "a", "b", "c", "d", "e")
и Array( "1", "2", "3", "4", "5")
? Вы действительно понимаете, что такое массив?
Application.Match
Sub LookupData()
Dim Faelle() As Variant: Faelle = VBA.Array("a", "b", "c", "d", "e")
Dim Werte() As Variant: Werte = VBA.Array(1, 2, 3, 4, 5)
Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
Dim ws As Worksheet: Set ws = wb.Worksheets("Sheet1")
Dim rg As Range: Set rg = ws.Range("A1").CurrentRegion
Dim rCount As Long: rCount = rg.Rows.Count - 1 ' exclude headers
Dim srg As Range: Set srg = rg.Resize(rCount).Offset(1) ' no headers
Dim sData() As Variant: sData = srg.Resize(, 3).Value ' first 3 columns
Dim dData() As Variant: ReDim dData(1 To rCount, 1 To 1)
Dim nIndex As Variant, r As Long, rString As String
For r = 1 To rCount
rString = CStr(sData(r, 1))
If Len(rString) = 0 Then
rString = CStr(sData(r, 3))
If Len(rString) = 0 Then
rString = CStr(sData(r, 2))
If Len(rString) > 0 Then
nIndex = Application.Match(rString, Faelle, 0)
If IsNumeric(nIndex) Then dData(r, 1) = Werte(nIndex - 1)
End If
End If
End If
Next r
Dim drg As Range: Set drg = srg.Columns(4)
drg.Value = dData
End Sub
Конечно, вы можете сократить цикл, потеряв переменную rString
и используя оператор And следующим образом:
For r = 1 To rCount
If Len(CStr(sData(r, 1))) = 0 And Len(CStr(sData(r, 3))) = 0 _
And Len(CStr(sData(r, 2))) > 0 Then
nIndex = Application.Match(CStr(sData(r, 2)), Faelle, 0)
If IsNumeric(nIndex) Then dData(r, 1) = Werte(nIndex - 1)
End If
Next r
Благослови тебя человек!!
Вам нужно было использовать VBA и массивы? Это можно сделать с помощью формулы в ячейке
=IF(CONCAT(A2:C2) = B2, ROW(B2),"")
По сути, если объединение всех ячеек = тому, что находится в B, то все столбцы в строке пусты. если true получить номер строки, если false ничего не выводить. Та же логика может быть реализована с помощью VBA и массивов.