Есть ли способ использовать разные предварительно определенные массивы каждый раз в цикле - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть подпрограмма, полученная из Интернета, которая будет организовывать столбцы листа заданным способом.Это работает для одного листа, но теперь у меня есть приложение, где мне нужно переупорядочить 4 листа, каждый в разном порядке.В этом коде использовался массив заголовков столбцов для изменения столбцов (colOrdr).Моя идея заключалась в том, чтобы определить массив для каждого листа, а затем «поменять» массив каждый раз через цикл.(colOdr1, colOdr, ...) Но я получаю несоответствие типов.Я знаю, что неправильно назначаю переменную colOrdr, но не могу понять, как это сделать правильно.

Sub ColOrder()

Dim search As Range
Dim cnt As Integer
Dim colOrdr As Variant
Dim sheetOrdr1 As Variant
Dim sheetOrdr2 As Variant
Dim sheetOrdr3 As Variant
Dim indx As Integer

' Define column order for each sheet using their column header names
    sheetOrdr1 = Array("ID", "Fname", "Lname", "Addr1", "Addr2", "City", "State", "Zip")
    sheetOrdr2 = Array("ID", "Hphone", "Cphone", "Fax", "Other")
    sheetOrdr3 = Array("ID", "Sdate", "Edate", "Active", "Rate", "Status", "Cert")

    Dim shCount As Integer
    shCount = 1
    For shCount = 1 To 3

        ThisWorkbook.Worksheets(shCount).Select ' Select worksheets left to right
        colOrdr = colOrdr & shCount ' Assign the array

        cnt = 1
        For indx = LBound(colOrdr) To UBound(colOrdr) ' I GET A TYPE MISMATCH ON THIS LINE
            Set search = Rows("1:1").Find(colOrdr(indx), LookIn:=xlValues, LookAt:=xlWhole, searchorder:=xlByColumns, searchdirection:=xlNext, MatchCase:=False)
             If Not search Is Nothing Then
                If search.Column <> cnt Then
                    search.EntireColumn.Cut
                     Columns(cnt).Insert Shift:=xlToRight
                    Application.CutCopyMode = False
                End If
            cnt = cnt + 1
            End If
        Next indx
     Next shCount

End Sub
'''

Ответы [ 2 ]

2 голосов
/ 19 сентября 2019

Ответ, предложенный @rskar, указывает на проблему и способ ее решения.Я мог бы предложить что-то вроде этого:

Sub ColOrder()
   Dim search As Range
   Dim cnt As Integer
   Dim colOrdr As Variant
   Dim indx As Integer
   Dim shCount As Integer

   For shCount = 1 To 3
       ThisWorkbook.Worksheets(shCount).Select ' Select worksheets left to right

       ' Define column order for each sheet using their column header names
       Select Case shCount
          Case 1
             colOrdr = Array("ID", "Fname", "Lname", "Addr1", "Addr2", "City", "State", "Zip")
          Case 2
             colOrdr = Array("ID", "Hphone", "Cphone", "Fax", "Other")
          Case 3
             colOrdr = Array("ID", "Sdate", "Edate", "Active", "Rate", "Status", "Cert")
       End Select

       cnt = 1

       For indx = LBound(colOrdr) To UBound(colOrdr)
           Set search = Rows("1:1").Find(colOrdr(indx), LookIn:=xlValues, LookAt:=xlWhole, searchorder:=xlByColumns, searchdirection:=xlNext, MatchCase:=False)
            If Not search Is Nothing Then
               If search.Column <> cnt Then
                   search.EntireColumn.Cut
                    Columns(cnt).Insert Shift:=xlToRight
                   Application.CutCopyMode = False
               End If
           cnt = cnt + 1
           End If
       Next indx
    Next shCount
End Sub

Код немного более компактен, потому что число переменных сокращено.

1 голос
/ 19 сентября 2019

Эта строка не приводит к массиву:

colOrdr = colOrdr & shCount ' Assign the array

Вот почему мы получаем несоответствие типов при For indx.

Я предполагаю, что вы хотите каким-то образом выполнить цикл по sheetOrdr1.. sheetOrdr3?Если так, попробуйте это:

colOrdr = Choose(shCount, sheetOrdr1, sheetOrdr2, sheetOrdr3) ' Assign the array
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...