Подгонка различных диапазонов в массиве.Диапазоны должны соответствовать некоторым критериям - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь написать код для создания массива из вставленного диапазона в 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
...