2017-11-26 40 views
0

ループ内のWorksheetオブジェクトを置き換える文字列の配列を使用したいと思いますが、わかりません。Excel VBAループ内のオブジェクト名である文字列の配列

私はObjectとしてSheetXを宣言すると、私はバリアントとしてSheetXを宣言した場合、私は、オブジェクトに必要なエラー

を取得し、その後、私はコンパイルエラーを取得:アレイ上の各変数のバリアント

Sub DeleteAllData() 

'SheetsArray = ["BalanceSheetTransposed", "IncomeStatementTransposed", "CashflowStatement"] 
Dim SheetsArray(0 To 2) As Variant 
Dim SheetX As Object 

SheetsArray(0) = "BalanceSheetTransposed" 
SheetsArray(1) = "IncomeStatementTransposed" 
SheetsArray(2) = "CashflowStatement" 

For Each SheetX In SheetsArray 
    lastrow = SheetX.Cells(Rows.Count, 1).End(xlUp).Row 
    lastcolumn = SheetX.Cells(1, Columns.Count).End(xlToLeft).Column 
    SheetX.Range("A2", Cells(lastrow, lastcolumn)).ClearContents 
Next SheetX 

End Sub 
+0

SheetsArray(IDX)は、文字列オブジェクトを返します。また、オブジェクト変数の値を設定するときに 'set objVar = ..'を使う必要があります。 – Whome

+0

@Whome私は論理に従うことができたらいいと思っていますが、あなたが言ったことをコードに変換する方法を理解できていないようです。 –

答えて

0

でなければなりません私の頭の中から私はこのマシンにExcelを持っていません。文字列をループし、ワークシートオブジェクトを設定します。

Sub DeleteAllData() 
    Dim SheetsArray(0 To 2) As String 
    Dim SheetX As Worksheet 
    Dim name as String 

    SheetsArray(0) = "BalanceSheetTransposed" 
    SheetsArray(1) = "IncomeStatementTransposed" 
    SheetsArray(2) = "CashflowStatement" 

    For Each name In SheetsArray 
    set SheetX = ActiveWorkbook.worksheets(name) 
    lastrow = SheetX.Cells(Rows.Count, 1).End(xlUp).Row 
    lastcolumn = SheetX.Cells(1, Columns.Count).End(xlToLeft).Column 
    SheetX.Range("A2", Cells(lastrow, lastcolumn)).ClearContents 
    Next 

End Sub 
+0

名前は文字列にすることはできません。 私はそれをVariantに変更すると、SheetXを設定した直後に「下付き文字が範囲外です」というメッセージが表示されます。地方のウィンドウでSheetXの値は "Nothing"になりますが、名前はタイプバリアント/ストリングの "BalanceSheetTransposed"の値をとります –

+0

もう一つの問題もあります。配列以外のバージョンでは、オブジェクト '_Worksheet'のメソッド '範囲'に失敗しました。これは奇妙に思えますが、私はいつもそれらを活性化せずにワークシートに何かをしますが、とにかく(TheWorksheetName)を追加しました。各行のセットの前に...アレイバージョンを修正しません。 –

+0

「下付き文字が範囲外になっています」と設定した直後に、SheetXを設定しています。アクティブなワークブックには「BalanceSheetTransposed」というワークシートがありません。 – YowE3K

1

あなたの大きな問題は、あなたは彼らがワークシートであるかのように配列に格納された文字列を処理しようとしていたが、彼らは単なる文字列であるということでした。

それを回避するための最も簡単な方法は、あなたが使用したい名前を持つワークシートを返すためにWorksheets(SheetsArray)を使用して、これらのワークシートをループすることです:

Sub DeleteAllData() 

    Dim SheetX As Worksheet 
    Dim lastRow As Long 
    Dim lastColumn As Long 

    Dim SheetsArray(0 To 2) As Variant 
    SheetsArray(0) = "BalanceSheetTransposed" 
    SheetsArray(1) = "IncomeStatementTransposed" 
    SheetsArray(2) = "CashflowStatement" 
    'An alternative to the previous 4 lines would be 
    'Dim SheetsArray As Variant 
    'SheetsArray = Array("BalanceSheetTransposed", _ 
    '     "IncomeStatementTransposed", _ 
    '     "CashflowStatement") 

    'Loop through the worksheets referred to in the array 
    For Each SheetX In Worksheets(SheetsArray) 

     With SheetX ' avoids some typing 
      lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row 
      lastColumn = .Cells(1, .Columns.Count).End(xlToLeft).Column 

      'Existing code would have had issue with the unqualified Cells 
      'reference in the following line. You should always qualify Cells 
      'to specify which sheet you mean, because it defaults to 
      'ActiveSheet.Cells 
      .Range("A2", .Cells(lastRow, lastColumn)).ClearContents 
     End With 

    Next SheetX 

End Sub 
0

Arrayがに渡す必要がありますSheets object:あなたは `設定SheetX = ActiveWorkbook.Worksheets(SHEETNAME)`とのforeach sheetnamesのようなものを使用する必要があるので、

Sub DeleteAllData() 
    Dim ws As Worksheet 

    For Each ws In Sheets(Array("BalanceSheetTransposed", "IncomeStatementTransposed", _ 
                  "CashflowStatement")) 
     s.UsedRange.Offset(1).ClearContents 
    Next 
End Sub 
関連する問題