人に聞けない痔の悩み、これでスッキリ >>

マクロを書く場合に次のように宣言しています。

Sub test()
'(1)始まり
Dim WB1 As Workbook
Dim SH1 As Worksheet
Set Wb1 = Workbooks("Book1")
Set Sh1 = Wb1.Worksheets("Sheet1")
'(1)終わり

Msgbox Sh1.Cells(1, 1)
end Sub

新たにマクロを書く場合には、その都度上記コードの「'(1)始まり~'(1)終わり」を書いていますが、面倒です。
「Public ~」などのように一箇所に宣言しておけば,他のモジュールからもブックやシートを参照できるようにする方法は無いでしょうか?

よろしくお願いします。

A 回答 (3件)

Test1 が実行された後なら Test2 も Test3 も下記で動くけど、、、


そういう事ではない?

'Module1-------------------------------
Public wb As Workbook
Public ws As Worksheet
Sub Test1()
  Set wb = ThisWorkbook
  Set ws = wb.Worksheets(1)
End Sub
'--------------------------------------

'Module2-------------------------------
Sub Test2()
  MsgBox ws.Cells(1, 1).Value
End Sub
'--------------------------------------

'Module3-------------------------------
Sub Test3()
  MsgBox ws.Cells(1, 1).Value
End Sub
'--------------------------------------
    • good
    • 0
この回答へのお礼

ありがとうございます。
私が知りたいのはpapayukaさんのおっしゃる「そういう事」です。
上記Test1を実行する必要があるのですね。
所定のコーディングをすれば、定数として設定できるものと思っていました。

お礼日時:2005/02/23 13:48

標準モジュールを作成し、モジュールレベルの宣言部に Public で変数を定義して、同モジュールに変数に値を入れるプロシージャを作成し、ブックのオープンイベントで上のプロシージャをコールしてみてはどうでしょう。


具体的には、

module(標準モジュール)
Public WB1 As Workbook
Public SH1 As Worksheet
sub main
Set WB1 = Workbooks("Book1")
Set SH1 = WB1.Worksheets("Sheet1")
End Sub

ThisWorkBook(クラス)
Private Sub Workbook_Open()
Call main
End Sub
    • good
    • 0
この回答へのお礼

ThisWorkBook(クラス)で呼び出すのは妙案ですね。
基本的にはNo1さんと同じと思うのですが、起動時にコールできれば楽ですね。
勉強になりました。ありがとうございます。

お礼日時:2005/02/23 13:44

No.1の papayuka さんのご回答のとおりなのですが、別解としてはPublic定数としてシート名やブック名を定義しておく方法があります。

利点としては、、、あまり無いように思いますが(--;)

papayukaさんの方法は、オブジェクト変数Shにアクセスするために

Set Sh = Sheets("Sheet1")
Sh.Select

のように予めSetステートメントでShを定義しなければなりません。
一方、シート名を文字列型の定数にした場合は

Public Const cnsShName as String ="Sheet1"

Sub Sample()
 Sheets(cnsShName).Select
End Sub

のように、シートを指定できます。

どちらの方法でも、同一プロジェクトの全てのプロシージャからシートを指定できますし、コーディングの手間も変わりません。

好みの問題かもしれませんが、私はSetを省略できるので良く定数を用います。

また、自信がないのですが、文字列型定数でシート名を保持する方が、オブジェクト変数でシートオブジェクトを保持するよりも省メモリなのではないかと思います。
(勘違いかもしれません)
    • good
    • 0
この回答へのお礼

ありがとうございます。
ただ、シート名を文字列型の定数にするのは、コーディングの手間と言う点で不利な気がするのですが。

sh.select と書くか
Sheets(cnsShName).Select と書くか

いかがでしょうか?

お礼日時:2005/02/23 13:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QExel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。

自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが…

Sub 別ブックから貼り付ける()
  Dim 検索する As Long
Windows("部品表.xls").Activate
検索する = cells(i,2).Value
Windows("コード一覧表.xls").Activate
ActiveWindow.SmallScroll Down:=-3
Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd

と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。

基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。

どうぞよろしくお願いします。

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数...続きを読む

Aベストアンサー

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★
 I = 2
 Do While Range("A" & I).Value <> ""
  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)
  I = I + 1
 Loop
 xlBook.Close
 Application.ScreenUpdating = True
 MsgBox ("完了")
End Sub

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks....続きを読む

QExcel VBAの SUM関数について質問です。

Excel VBAの SUM関数について質問です。

SUM関数で合計の値を出す場合、

SUM(A1:A5)という関数で合計を出しますが

SUM(sheet2.cells(1,1),sheet2.cells(5,1))
と言ったようにCellsで指定はできないのでしょうか?

複数の列にVBAのプログラムで合計の値を出したいのです。

WorksheetFunction.SumではSUM(A1:A5)のように
自動計算にならないと思うので・・・

Aベストアンサー

例えば、Sheet2のA6セルに質問の数式を入力するのであれば次のようにします。
Worksheets("Sheet2").Cells(6, 1).Formula = "=SUM(" & Cells(1, 1).Address & ":" & Cells(5, 1).Address & ")"

Sheet1のような別シートのA1セルに質問の数式を入力するのであれば次のようにします。
Worksheets("Sheet1").Cells(1, 1).Formula = "=SUM(Sheet2!" & Cells(1, 1).Address & ":" & Cells(5, 1).Address & ")"

QVBA モジュールで共通に使う変数の宣言方法

VBAにてプログラミングを覚えている者です。

現在、いくつかのモジュールがあり、それぞれDimにて宣言している共通の変数があります。
いくつものプロシージャに毎回宣言せず、どこかでひとまとめにしたいと思い、色々と調べています。

例えば、

Dim pic1 As Picture
Dim cell1 As String
Dim pass1 As String
Dim pic2 As Picture

などです。


Dimのほかに、Publicの宣言などがありますが、いま一つ使い方がピンときません。

共通宣言する変数をひとつのモジュールとして登録し、活用できると、いざ変更となったときに
その内容だけ置き換えればいいと思うのですが、みなさんはどのように宣言をしていますか?
(例えば、Stringなどは各モジュールで変更するのが大変だと思うのですが・・・)

ヒントを教えていただければと思います。よろしくお願いします。

Aベストアンサー

>モジュールで共通に使う変数の宣言方法

モジュールの先頭に書いたdimで宣言すると,そのモジュールの中だけ(に記入されている各プロシジャ)でパブリックになります。
モジュールの先頭に書いたpublicで宣言すると,全モジュール(に記入されている各プロシジャ)に対してパブリックになります。

「変数宣言モジュール」のようにモジュールを越えて参照させたいという事なので,DimではなくPublicで宣言します。


Module1:
public x as variant


Module2:
sub macro1() ’先に実行する
x = "abc"
end sub


Module3:
sub macro1()
msgbox x
end sub


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング