2017-06-20 12 views
3

VBAのワークブックの正しいアドレスに関する質問があります。これはかなり新しいです。VBA:関数への引数としてワークシートを渡すときに正しいブックを呼び出す方法

これまで行ってきたことは次のとおりです。
CodeName "table10"のワークシートを作成するサブを作成しました。この機能

Text_To_Numbers(worksheet as worksheet) 

ワークシートの引数を期待:

は、その後、私は言ったシートの内容を操作する機能を定義しました。ここに私の問題であり、今

Call Text_To_Numbers(table10) 

:私は、次の行を使用して別のサブからの関数を呼び出すだけ開いているブックは、私は私の機能と操作したいものです
上記作品完璧とき。ただし、複数の開いているブックがある場合、この関数は別のブックを操作しようとし、エラーが発生します。

使用するワークブックを指定する方法が必要であることは確かですが、見つけられません。つまり、別の複雑さがあります。私が操作したいワークブックの名前はマシンで生成されるため、常に別の名前が付けられます。つまり、同じファイル名への明示的な参照を何度も使用することはオプションではありません。

誰でも私がこれを解決するのに役立つでしょうか?

+2

'ThisWorkbook.table10'や' ThisWorkbook.Worksheets( "Table10") 'のようにマクロが動作しているブックのために' ThisWorkbook'を使用するか、 'Application.Workbooks(" WorkBookName.xlsm ")を使用してください。 ")"を他のワークブックに使用します。 –

+0

また、ワークブック変数「Dim wb as Workbook」を宣言し、それを使用することもできます: 'Set wb = Workbooks.Open(" Somepath \ Somefile.xlsx ")'を開いてから 'wb.Worksheets(1)'そのワークブック内の最初のシートを参照します。 –

+0

他のワークブックプロジェクトに参照が設定されていない限り、 'table10'は、コードネームであれば、常にコード付きのブック内のシートを参照します。 – Rory

答えて

2

VBAのオブジェクトは、親が何であるかあいまいな状況を避けるために、完全に修飾する必要があります。

状況によっては、シートを親ブックに接続する必要があります。そのブックが特定のブックから来たものであることを確認してください。あなたが直接そのコードネームにより他のブック内のワークシートを参照することはできません

、これが唯一のThisWorkbookオブジェクト(VBAコードを含むブック)に行うことができます。別のブックからコードネームでシートを取得する方法の詳細については、Fully reference a worksheet by codenameの質問を参照してください。私は答えにこの関数を含め、この文脈でそれをどのように使用するのかを考えました。

あなたは、次のいずれかのシートtable10を作成しました:

  • ActiveWorkbook
  • はThisWorkbook
  • WB(一部のワークブックオブジェクト)

だから、そのワークブックオブジェクトを使用してアクセスすることができます名前の必要性なしに! ThisWorkbook.table10を使用して


はちょうどtable10と同じ動作を与える必要がありますが、ここで関数を呼び出すための2つのすっきり例があります。

' A neater way to call the function: 
Text_To_Numbers worksheet:=ThisWorkbook.table10 
' You could also call it simply using 
Text_To_Numbers ThisWorkbook.table10 


あなたのシートがThisWorkbook

' Get sheet (from the workbook object you are using, WB) and pass to your Text_To_Numbers 
Text_To_Numbers GetSheetWithCodename("table10", WB) 

Function GetSheetWithCodename(ByVal worksheetCodename As String, Optional wb As Workbook) As Worksheet 
    Dim iSheet As Long 
    If wb Is Nothing Then Set wb = ThisWorkbook ' mimics the default behaviour 
    For iSheet = 1 To wb.Worksheets.Count 
     If wb.Worksheets(iSheet).CodeName = worksheetCodename Then 
      Set GetSheetWithCodename = wb.Worksheets(iSheet) 
      Exit Function 
     End If 
    Next iSheet 
End Function 
0

内にない場合は、いくつかの作業を行う必要がある場合は、この方法でそれを呼び出してその変数に、ブックやシートを割り当ててみそれに:

Dim WB As Workbook 

Dim WS As Worksheet 

'If you want to open the workbook before doing work 
Set WB = Workbooks.Open("/Workbook path name goes here”) 

Set WS = WB.Worksheets("Table‌​10") 

次に、指定したシート内で操作を実行するために、関数内からWS変数への呼び出しを渡すだけです。

編集:

謝罪、あなたは私が最初にあなたの質問を読んだとき、プロジェクトエディタでインデックス名を参照しようとしていたことに気づきませんでした。アイデアのためのEnderland

Sub UseCodeNameFromOutsideProject() 
Dim WS As Worksheet 
With Workbooks("MyWorkbook.xlsb") 
    Set WS = _ 
     .Worksheets(CStr(.VBProject.VBComponents("Sheet1").Properties(7))) 
     WS.Range("A1").Copy 
     Selection.Copy 
     WS.Range("B1").PasteSpecial 
End With 
End Sub 

ありがとう:コードネームは別のワークブックからのコピー/貼り付けを実行するために、ブックやシートのコードネームを選択する方法を示し、次の例で、外部のブックから参照することができます。

+1

@data_beta [VBAベストプラクティス:SELECTまたはACTIVATEの使用を避ける](https://stackoverflow.com/documentation/excel-vba/1107/vba-best-practices/9292/avoid-using-select)を読むことはお勧めできません - または - 活性化)。 –

+1

うーん、あなたの答え全体を別のワークブックのコードネームでワークシートにアクセスするにはちょっと面倒な方法については、「この回答を見る(https://stackoverflow.com/a/22256782/3978545)」に置き換えることができます。しかし、はい、これは今、トピックの答えにもう少しです! – Wolfie

+1

'WBでDim WS As Worksheetが動作するのですか?前にWBで 'の構文を見たことはありません。少なくともMS Excel 2016ではこれは動作しません。 –

関連する問題