2016-10-12 28 views
1

新しいブックに複数のシートをコピーすることを模倣しようとしていますが、配列関数で文字通りシート名を使用すると問題ありません。文字列を配列関数に渡すことができません:添え字が範囲外です

しかし、文字列変数を配列に渡そうとすると、添字が範囲外のエラーになります。

懸念の行は次のとおりです。

Wb.Sheets(Array(SheetsArray)).Copy After:=RegionWb.Sheets(RegionWb.Sheets.count) 

以下の私のコードを参照してください。

Sub CreateFiles() 
    Application.ScreenUpdating = False 
    Dim LastRow As Long 
    Dim WKC As String: WKC = Replace(DateValue(DateAdd("ww", -1, Now() - (Weekday(Now(), vbMonday) - 1))), "/", ".") 
    Dim FilePath As String: FilePath = "Z:\MI\Krishn\Retail" 
    Dim BuyerLastRow As Long 
    Dim Wb As Workbook: Set Wb = ActiveWorkbook 
    Dim RegionWb As Workbook 
    Dim RegionCount As Integer 
    Dim RegionCounter As Integer 
    Dim SheetsArray As String 
     With BuyerList 
      LastRow = .Range("G1048576").End(xlUp).Row 
      BuyerLastRow = .Range("A1048576").End(xlUp).Row 
      'Create WKC Dir 

      If Dir(FilePath & "\" & WKC, vbDirectory) = "" Then 
       MkDir FilePath & "\" & WKC 
      End If 

      'Create Create Files 
      If CountFiles(FilePath & "\" & WKC) = 0 Then 
       For i = 2 To LastRow 
        RegionCounter = 0 
        SheetsArray = "" 
'     Set RegionWb = Workbooks.Add 
'     'wb.SaveAs FilePath & "\" & WKC & "\" & .Cells(i, 7).Value 
'     RegionWb.SaveAs FilePath & "\" & WKC & "\" & "WKC " & WKC & " - " & .Cells(i, 7).Value & ".xlsb", 50 

         For j = 2 To BuyerLastRow 
          RegionCount = Application.WorksheetFunction.CountIf(.Range("C:C"), .Cells(i, 7).Value) 
          If .Cells(i, 7).Value = .Cells(j, 3).Value Then 
           SheetsArray = SheetsArray & """" & .Cells(j, 2).Value & """," 
           RegionCounter = RegionCounter + 1 
           If RegionCounter = RegionCount Then 
            Debug.Print Left(SheetsArray, Len(SheetsArray) - 1) 
            Set RegionWb = Workbooks.Add 
            RegionWb.SaveAs FilePath & "\" & WKC & "\" & "WKC " & WKC & " - " & .Cells(i, 7).Value & ".xlsb", 50 
            'Wb.Sheets(Array(Left(SheetsArray, Len(SheetsArray) - 1))).Copy After:=RegionWb.Sheets(RegionWb.Sheets.count) 
            SheetsArray = Left(SheetsArray, Len(SheetsArray) - 1) 
            Wb.Sheets(Array(SheetsArray)).Copy After:=RegionWb.Sheets(RegionWb.Sheets.count) 
            'Wb.Sheets(Array()).Copy After:=RegionWb.Sheets(RegionWb.Sheets.count) 
            RegionWb.Save 
            RegionWb.Close 
            Exit For 
           End If 
'        Wb.Sheets(Wb.Sheets("Buyer list").Range(Cells(j, 2).Address).Value).Copy After:=RegionWb.Sheets(RegionWb.Sheets.count) 
          End If 
         Next j 
' 
' 

       Next i 
      End If 


     End With 
    Application.ScreenUpdating = True 
End Sub 
+2

あなたはそれはそれがどのように動作するかではありません、Array' 'に渡すカンマで区切られた文字列を構築しません。配列を事前に宣言し、 'Array'を呼び出さずに[fill it](http://stackoverflow.com/q/8850984/11683)してください。 – GSerg

+0

'配列(SheetsArray)'は、1つのエントリを持つ配列を作成します。 'Sheets(X)'では、Xは数値でも文字列でも配列ではありません。 'MyArray = Array(SheetsArray)'と 'Sheets(MyArray(0))'を試してみてください。警告。 MyArrayはArrayで初期化するVariantとして宣言する必要があります。 Arrayで作成される配列の下限は 'Option Base'に依存します。私は 'VBA.Array'を好む。 –

+0

@TonyDallimore 'Sheets(X)'では 'X'が配列になります(https://msdn.microsoft.com/en-us/library/office/ff193217.aspx#Anchor_1)。 – GSerg

答えて

1

をあなたはこのような配列に文字列を分割することができます

Wb.Sheets(Split(SheetsArray, ",")).Copy After:=RegionWb.Sheets(RegionWb.Sheets.Count)

GSergが指摘したように、あなたはワークシートの引用符を削除する必要があります名前。

SheetsArray = SheetsArray & .Cells(j, 2).Value & ","

ワークシート名はコンマではなく、バックスラッシュを含めることができるので、バックスラッシュは、カンマを使用して、より安全な区切りになります。

SheetsArray = SheetsArray & .Cells(j, 2).Value & "/"

Wb.Sheets(Split(SheetsArray, "/")).Copy After:=RegionWb.Sheets(RegionWb.Sheets.Count)

+0

@GSergありがとう、私は彼の完全なコードをどのように読む必要があります。 –

+1

ただし、唯一の問題は、Excelシート名にコンマ( '"利益、月次 ")が含まれていることが一般的だということです。 – GSerg

+0

@GSergが更新されました。再度、感謝します –

関連する問題