Возможен ли массив внутри оператора select case? - PullRequest
0 голосов
/ 08 февраля 2020

Я просто хочу знать, можно ли мне назначить массив и использовать его в качестве квалификатора внутри оператора case?

Sub AccountCopy()
Dim Criteria1 As Variant
Dim Criteria2 As Variant
Dim Acct As Variant
Dim NR As Integer

Criteria1 = Array("Checking", "Savings")
Criteria2 = Array("Loans", "Credit Card")

MonthSheet.Range("T1") = "Title"
MonthSheet.Range("U1") = "Account"
MonthSheet.Range("V1") = "Description"
MonthSheet.Range("W1") = "Amount"
MonthSheet.Range("X1") = "Date"
MonthSheet.Range("Y1") = "Category"

With Range("T1:Y1")
    .Font.Name = "Calibri"
    .Font.Size = 8
    .Font.Bold = True
    .HorizontalAlignment = xlCenter
    .Style = "Title"
    .Columns.AutoFit
End With



For Each Acct In [AccountNameList]
    Select Case Acct.Offset(0, 1).Value
        Case Is = Criteria1
            NR = Range("T" & Rows.Count).End(xlUp).Row + 1 'Next Row
            'MonthSheet.Range 
        Case Criteria2
    End Select

Не критикуйте меня слишком сильно, я все еще довольно новый для этого. Я не часто публикую посты на четверых, но здесь есть несколько действительно талантливых людей, и я подумал, кого лучше спросить, чем люди, которые программировали годами? Заранее спасибо!

Это то, чего я хочу достичь sh: я хочу определить массив "Критерии1" для того, сколько бы измерений я не желал. Возможно, я хочу добавить третий список в список. Вместо того, чтобы идти и изменять оператор case, я бы просто добавил в массив позже, чтобы включить этот дополнительный квалификатор. Возможно, я установил неправильный тип? Я не знаю? Я чувствую, что это можно сделать довольно легко, но мне не хватает очень мелких деталей.

1 Ответ

0 голосов
/ 08 февраля 2020

Некоторые замечания:

  1. Вы определяете одномерный массив, и вам не нужен двух / трехмерный массив для достижения sh того, что вы хотите. Проверьте Учебное пособие Матье , чтобы узнать об этом
  2. Всегда полностью квалифицировать объекты, чтобы избежать непредвиденного поведения кода
  3. Сделать отступ в коде (вы можете использовать бесплатный www.rubberduckvba.com, чтобы помочь вам в этом)
  4. То, что вы хотите, полностью выполнимо ... по-разному, просто используйте вспомогательную функцию, чтобы найти совпадение в массиве.

Прочитайте комментарии к коду и настройте его в соответствии с вашими потребностями

Опция вспомогательной функции

Option Explicit

Public Sub AccountCopy()

    Dim Criteria1 As Variant
    Dim Criteria2 As Variant
    Dim Acct As Variant ' This can be declared as a Range
    Dim NR As Integer ' Better to name the variables to something readable like: newRow

    ' Added this new variable
    Dim accountValue As String

    Criteria1 = Array("Checking", "Savings")
    Criteria2 = Array("Loans", "Credit Card")

    MonthSheet.Range("T1") = "Title"
    MonthSheet.Range("U1") = "Account"
    MonthSheet.Range("V1") = "Description"
    MonthSheet.Range("W1") = "Amount"
    MonthSheet.Range("X1") = "Date"
    MonthSheet.Range("Y1") = "Category"

    ' This next line should be something like: <TheCodeNameOfTheSheet>.Range("T1:Y1") to be fully qualified
    With Range("T1:Y1")
        .Font.Name = "Calibri"
        .Font.Size = 8
        .Font.Bold = True
        .HorizontalAlignment = xlCenter
        .Style = "Title"
        .Columns.AutoFit
    End With


    ' In here, it's easier to understand if you use Thisworkbook.Names("AccountNameList")
    For Each Acct In [AccountNameList]

        ' Store the account next cell's value
        accountValue = Acct.Offset(0, 1).Value

        Select Case True
        Case IsInArray(accountValue, Criteria1)
            ' Do something
            Debug.Print "Something", Acct.Offset(0, 1).Address
        Case IsInArray(accountValue, Criteria2)
            ' Do something else
            Debug.Print "Something else", Acct.Offset(0, 1).Address
        End Select

    Next Acct

End Sub

Public Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
    ' Credits: https://stackoverflow.com/a/11112305/1521579
    IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1)
End Function

Еще один подход к l oop через элементы массива

с чем-то вроде этого ...

Добавьте это внутри для каждого l oop

потребностей dim counter as long где-то в коде

For counter = 0 To UBound(Criteria1)
    If Acct.Offset(0, 1).Value = Criteria1(counter) Then
        ' Do something
        Debug.Print "Something", Acct.Offset(0, 1).Address
    End If
Next counter

For counter = 0 To UBound(Criteria2)
    If Acct.Offset(0, 1).Value = Criteria2(counter) Then
        ' Do something else
        Debug.Print "Something else", Acct.Offset(0, 1).Address
    End If
Next counter
...