Я пытаюсь написать код для создания массива из вставленного диапазона в Excel.
Проблема заключается в том, что не все ячейки должны быть помещены в вставленный диапазон.
Outиз диапазона 11 X 8, я хочу поместить в массив только ячейку, имеющую первую строку, содержащую (a, b, g).
Пожалуйста, не предлагайте вводить столбцы индекса с номерами, поскольку порядок столбцов изменяется для каждого пользователя.
Ниже приведен пример:
Таблица с данными
a b c d e f g h
78,74 string 93,83 15/01/1900 98,44 60,41 59,53 45,04
71,39 string 64,66 02/04/1900 55,63 10,13 68,20 68,97
37,43 string 39,52 20/01/1900 79,25 96,74 54,68 48,02
30,27 string 64,54 12/01/1900 46,68 50,41 23,46 63,41
89,18 string 12,35 13/01/1900 31,25 33,94 4,99 26,45
13,29 string 11,98 11/01/1900 79,91 45,35 29,85 30,18
64,13 string 1,72 01/03/1900 85,61 64,36 51,88 93,35
1,80 string 73,42 06/03/1900 2,40 84,37 9,44 82,81
87,98 string 10,71 20/03/1900 99,79 6,19 95,48 75,34
35,93 string 63,43 23/03/1900 69,62 20,11 53,16 59,58
Отфильтрованная таблица, если первая ячейка содержит a, b или g, то она принадлежит массиву.
a b g
78,73503809 string 59,53
71,38576766 string 68,20
37,42544118 string 54,68
30,26658463 string 23,46
89,18188704 string 4,99
13,28803884 string 29,85
64,13289793 string 51,88
1,80396732 string 9,44
87,98382061 string 95,48
35,93319354 string 53,16
Код должен пытаться сохранить значения вариантов, поскольку таблица содержит даты, числа и слова.
Sub Macro2()
Dim i As Variant
Dim l As Long
Dim p As Long
Dim myArray() As Variant
Dim DataRange As Range
Dim cell As Range
Dim x As Long
Dim CSico As Long
Dim CTradeID As Long
Dim CBusinessEvent As Long
Dim CNetAmount As Long
Dim CTradeDate As Long
Dim CPaymentDate As Long
Dim CMaturity As Long
Dim CNominal As Long
l = ActiveSheet.Cells(1, Columns.Count).End(xlToLeft).Column
p = ActiveSheet.Cells(Rows.Count, 5).End(xlUp).Row
For i = 1 To l
If Cells(1, i).Value = "Sicovam" Then CSico = i
Next i
For i = 1 To l
If Cells(1, i).Value = "Trade ID" Then CTradeID = i
Next i
For i = 1 To l
If Cells(1, i).Value = "Business Event" Then CBusinessEvent = i
Next i
For i = 1 To l
If Cells(1, i).Value = "Net Amount" Then CNetAmount = i
Next i
For i = 1 To l
If Cells(1, i).Value = "Trade Date" Then CTradeDate = i
Next i
For i = 1 To l
If Cells(1, i).Value = "Payment Date" Then CPaymentDate = i
Next i
For i = 1 To l
If Cells(1, i).Value = "Maturity" Then CMaturity = i
Next i
For i = 1 To l
If Cells(1, i).Value = "Nominal" Then CNominal = i
Next i
Dim rng1 As Range: Set rng1 = Range(Cells(1, CTradeID), Cells(l, CTradeID))
Dim rng2 As Range: Set rng2 = Range(Cells(1, CBusinessEvent), Cells(l, CBusinessEvent))
Dim rng3 As Range: Set rng3 = Range(Cells(1, CNetAmount), Cells(l, CNetAmount))
Dim rng4 As Range: Set rng4 = Range(Cells(1, CBusinessEvent), Cells(l, CBusinessEvent))
Dim rng5 As Range: Set rng5 = Range(Cells(1, CTradeDate), Cells(l, CTradeDate))
Dim rng6 As Range: Set rng6 = Range(Cells(1, CPaymentDate), Cells(l, CPaymentDate))
Dim rng7 As Range: Set rng7 = Range(Cells(1, CMaturity), Cells(l, CMaturity))
Dim rng8 As Range: Set rng8 = Range(Cells(1, CNominal), Cells(l, CNominal))
Dim rngAll As Range: Set rngAll = Union(rng1, rng2, rng3, rng4, rng5, rng6, rng7, rng8)
Dim myArr As Variant
Dim firstRow As Long: firstRow = 1
Dim lastRow As Long: lastRow = rngAll.Rows.Count
Dim evalRows As Variant
evalRows = Application.Evaluate("row(" & firstRow & ":" & lastRow & ")")
myArr = Application.Index(rngAll, evalRows, Array(CTradeID, CBusinessEvent, CNetAmount, CBusinessEvent, CTradeDate, CPaymentDate, CMaturity, CNominal))
Dim myCol As Long, myRow As Long
For myCol = LBound(myArr) To UBound(myArr)
For myRow = LBound(myArr, 2) To UBound(myArr, 2)
Debug.Print myArr(myCol, myRow)
Next
Next
ActiveSheet.Range("A10:H&l+12") = myArr()
End Sub