これは些細な質問として出てくるかもしれませんが、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
取得したいワークシートがコンパイル時にThisWorkbook
(つまり、見ているVBAコードを含むワークブック)に存在する場合、そのWorksheet
オブジェクトを参照する最も簡単で一貫した信頼できる方法は、 コード名:
Debug.Print Sheet1.Range("A1").Value
(Name)
を変更することにより、(タブ名)(ユーザーがいつでも変更できる)に関係なく、コード名を必要なもの(有効なVBA識別子である限り)に設定できます。 Propertiesツールウィンドウのプロパティ(F4):
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
変数を使用してください。
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
驚いたことに、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
他のモジュール/サブと衝突することがあるため、変数の名前を変更してみてください
Dim Workbk As Workbook
Dim Worksh As Worksheet
しかし、また、試してください
Set ws = wb.Sheets("name")
Sheet
で動作するかどうか覚えていない