web-dev-qa-db-ja.com

可変ワークブック/ワークシートVBAの宣言

これは些細な質問として出てくるかもしれませんが、workbookの変数としてworksheetまたはVBAを宣言することはできないようです。私は次のコードを持っていますが、私が間違っていることを理解することはできません、それは簡単なはずです。通常、Dim i As Integerなどの変数の宣言に問題はありません。

sub kl() 

    Dim wb As Workbook
    Dim ws As Worksheet

    Set wb = ActiveWorkbook
    Set ws = Sheet("name")

    wb.ws.Select

End Sub

上記のコードを実行すると、type missmatchエラーが表示されます。

SheetではなくSheetsを使用し、順番にアクティブにします。

Sub kl()
    Dim wb As Workbook
    Dim ws As Worksheet
    Set wb = ActiveWorkbook
    Set ws = Sheets("Sheet1")
    wb.Activate
    ws.Select
End Sub
17
Gary's Student

取得したいワークシートがコンパイル時にThisWorkbook(つまり、見ているVBAコードを含むワークブック)に存在する場合、そのWorksheetオブジェクトを参照する最も簡単で一貫した信頼できる方法は、 コード名

Debug.Print Sheet1.Range("A1").Value

(Name)を変更することにより、(タブ名)(ユーザーがいつでも変更できる)に関係なく、コード名を必要なもの(有効なVBA識別子である限り)に設定できます。 Propertiesツールウィンドウのプロパティ(F4):

Sheet1 properties

Nameプロパティは、ユーザーが気まぐれに変更できる「タブ名」を参照します。 (Name)プロパティは、ワークシートのコード名を参照し、ユーザーはVisual Basic Editorにアクセスしないと変更できません。

VBAはこのコード名を使用して、コードが自由にそのシートを参照するためにどこでも使用できるグローバルスコープWorksheetオブジェクト変数を自動的に宣言します。

言い換えると、コンパイル時にシートがThisWorkbookに存在する場合、その変数を宣言する必要はありません-変数は既に存在します!


ワークシートが実行時に作成される場合(ThisWorkbook内またはそうでない場合)、thenその変数にWorksheet変数を宣言して割り当てる必要があります。

WorksheetsオブジェクトのWorkbookプロパティを使用して取得します。

Dim wb As Workbook
Set wb = Application.Workbooks.Open(path)

Dim ws As Worksheet
Set ws = wb.Worksheets(nameOrIndex)

重要な注意事項...

  • ワークシートの名前とインデックスの両方は、ユーザーが(偶然にかかわらず)簡単に変更できます。ワークブックの構造が保護されていない限り。ブックが保護されていない場合、名前またはインデックスだけで目的のワークシートが得られるとは考えられません-シートの形式を検証することは常に良い考えです(たとえば、セルA1に特定のテキストが含まれていることを確認する、または特定の列見出しを含む特定の名前のテーブルがあること)。

  • Sheetsコレクションを使用すると、Worksheetオブジェクトが含まれますが、Chartインスタンス、およびワークシートではなくである6種類以上の従来のシートタイプを含めることもできます。 Sheets(nameOrIndex)が返すものからWorksheet参照を割り当てると、その理由でtype mismatch実行時エラーがスローされる危険があります。

  • なしqualifyingWorksheetsコレクションはimplicit ActiveWorkbook reference-命令の実行時にアクティブなワークブックからWorksheetsコレクションがプルされることを意味します。このような暗黙の参照により、特にコードの実行中にユーザーがExcel UIをナビゲートして操作できる場合、コードが脆弱でバグが発生しやすくなります。

  • activate特定のシートを意味する場合を除き、ワークシートで行うことの99%を実行するためにws.Activateを呼び出す必要はありません。代わりにws変数を使用してください。

8
Mathieu Guindon

3番目の解決策:Sheet("name")の使用は常にアクティブなワークブックを参照するため、ワークシートwsのシートにwbを設定します。

sub kl() 

    Dim wb As Workbook
    Dim ws As Worksheet

    Set wb = ActiveWorkbook
    'be aware as this might produce an error, if Shet "name" does not exist
    Set ws = wb.Sheets("name")
    ' if wb is other than the active workbook
    wb.activate
    ws.Select

End Sub
2
DrMarbuse

驚いたことに、Excel 2007以降のバージョンでは、ブックとワークシートの変数を宣言する必要があります。単一行の式を追加するだけです。

Sub kl()

    Set ws = ThisWorkbook.Sheets("name")
    ws.select
End Sub

他のすべてを削除してお楽しみください。しかし、なぜシートを選択するのですか?シートの選択は、計算と操作のために古くなりました。このような式を追加するだけです

Sub kl()

    Set ws = ThisWorkbook.Sheets("name")
    ws.range("cell reference").formula = "your formula"
'OR in case you are using copy paste formula, just use 'insert or formula method instead of ActiveSheet.paste e.g.:
   ws.range("your cell").formula
'or
   ws.colums("your col: one col e.g. "A:A").insert
'if you need to clear the previous value, just add the following above insert line
   ws.columns("your column").delete

End Sub
0
P K Prabhakar

他のモジュール/サブと衝突することがあるため、変数の名前を変更してみてください

 Dim Workbk As Workbook
 Dim Worksh As Worksheet

しかし、また、試してください

 Set ws = wb.Sheets("name")

Sheetで動作するかどうか覚えていない

0
DannyBland