[[20060620103137]] 『Sheet1.マクロ名 と保存されてしまいます』(マキ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『Sheet1.マクロ名 と保存されてしまいます』(マキ)

 ありかたくこちらから頂いたVBAを
 エディタに貼り付けての疑問なんですが

 sub マクロ名() で、名前つけまして
 そしてワークシートにもどって
 ツール→マクロで表示されるときに
 Sheet1.マクロ名
 となるのですが、これはどうゆう時になってしまうのですか?
 回避方法あるのでしょうか?
 以前登録VBAには、「Sheet1.」の部分が出てきません。
 VBAのエディタの仕組みを理解出来ていないので
 解決がわかりません。
 宜しくお願いします。

 Excel2003、XP

 マクロ名のコードが、Sheet1のモジュールに書かれているからです。
 標準モジュールに移せば"Sheet1."は取れます。

 が、コードの書かれ方によっては、問題が発生する可能性があります。

 (seiya)

seiyaさま、いつもありがとうございます。

 左の帯部(Projectとか書いてあるところ)
 見ると、確かにSheet1とかありますが
 ご教授内容の、標準モジュールに移すとは・・・?

 初歩的ですみませんが
 Sheet1と、標準モジュールの違いすらよくわかりません。
 移行の方法を教えて頂ければ幸いです。

 コードの書かれ方ですか?
 頂いたVBAなので、それすらよくかわりません。
 尚、こちらに貼り付けさせて頂きます。
 (たたみさま、ありがとうございます)

Sub page1()

 Dim L_PAGE As Long
 '     L_PAGE = InputBox("ページ数")
     'L_PAGE = Application.ExecuteExcel4Macro("GET.DOCUMENT(50)")
     L_PAGE = PageNum(Selection)
     ActiveWindow.SelectedSheets.PrintOut From:=L_PAGE, To:=L_PAGE, Copies:=1, _
     Preview:=True, Collate:=True
 End Sub
Function PageNum(adrs As Range) As Long 

 Application.Volatile

 Dim tH_b As Long, tV_b As Long, i As Long
 Dim WS As Worksheet

 Set WS = Worksheets(adrs.Worksheet.Name)

 tH_b = WS.HPageBreaks.Count
 tV_b = WS.VPageBreaks.Count

 PageNum = 1

 If WS.PageSetup.Order = xlDownThenOver Then
    For i = 1 To tH_b
        If WS.HPageBreaks(i).Location.Row < adrs.Row + 1 Then _
            PageNum = PageNum + 1
    Next
    For i = 1 To tV_b
        If WS.VPageBreaks(i).Location.Column < adrs.Column + 1 Then _
            PageNum = PageNum + tH_b + 1
    Next
 ElseIf WS.PageSetup.Order = xlOverThenDown Then
    For i = 1 To tV_b
        If WS.VPageBreaks(i).Location.Column < adrs.Column + 1 Then _
            PageNum = PageNum + 1
    Next
    For i = 1 To tH_b
        If WS.HPageBreaks(i).Location.Row < adrs.Row + 1 Then _
            PageNum = PageNum + tV_b + 1
    Next
 End If

 End Function


 [挿入]->[標準モジュール] でモジュールが追加されます。
 既に追加されていれば、[Module1]とかあるはずです。
 そちらに移動すれば、OKです。

 ご提示のコードは問題ないと思います。
 Cellsプロパティー等がParent Object を指定しないで記述されていた場合などは
 不具合が生じる事がありますので。

 左枠(Project Explorer)のSheet1をダブルクリックすると
 右枠(Code Pane)にコードが表示されますので、コードを切り取り

 追加した標準モジュールのアイコンをダブルクリックして、貼り付けて下さい。

 (seiya)

seiyaさま、ありがとうございました。

 Sheet1のところを消して、[Module1]に貼り付けたら
 解決されました\(^ ^)/ 。

 通常貼り付ける場合は、[挿入]->[標準モジュール] で
 やれば、いいのですよね?
 Sheet1では、ないという事ですね。
 seiyaさまから、ご注意頂いた事の場合は、(そうゆう記述)
 Sheet1に貼り付けるみたいなですか?
 何度もすみませんが
 宜しくお願いします。

 記述さえしっかりしていれば、基本的にどのモジュールでも大丈夫です。

 ごく稀に下記のような記述のコードを見る事があります。

 Sub マクロ名()
 Dim i As Long
    For i = 1 To 100
      Cells(i,1) = i
    Next
 End Sub

 これを意図的にSheetモジュールに記述してある場合があります。
 通常Cellsプロパティーは親オブジェクト(Sheet/Range)を持つ必要がありますが
 Sheetモジュールに記述された場合は Me.Cells(i,1) または Sheets("Sheet1").Cells(i,1)
 (Meは親オブジェクトでSheet)
 に成ります。

 これをそのまま標準モジュールに移行してしますと、標準モジュールは親オブジェクトを
 持たないので、違った結果を導く可能性があります。

 こちらでの回答はみなさん、モジュールを指定して貼り付けるようにされていると思いますので
 このような問題は発生しないと思います。

 (seiya)

 seiyaさま、ありがとうございました。

 計算させるような関数では、
 Sheetに貼り付けるということですね!(Sheetに依存みたいなかな?

(例を示して頂いた Cells(i,1) = i は、どこかで見た気がするが(-_-;)

 どんなとき使うのか・・気になる・・・)

 でも、お陰でようやく違いがわかってきました。
 ありがとうございました<(_ _)>。


 >計算させるような関数では......

 そうではなくて、シートモジュールに記述されたコードの中のオブジェクト/プロパティー
 は、明示的に指定しない限り、書かれたモジュールのシートがParent Objectになるという意味です。

 例:Sheet1のモジュールに下記のコードがかかれている場合

 Sheets("Sheet3").Range("a1").Value = Range("a1).Value

 このような場合、右辺のRange("a1")はSheets("Sheet1").Range("a1").Valueに成るという事です。

 これをそのまま標準モジュールで使用すると、右辺は
 Activesheet.Range("a1").Value になり、Sheet2がActiveの場合は、Sheets("Sheet2").Range("a1")に成ってしまいます。

 コードを書く場合、Range/Cellsに関してはSheet名を明示的に指定する方が確実に動いてくれます。

 (seiya)

 seiyaさま、ありがとうございました。

 シートを指定しないと、アクティブなシートに参照してしまう
 みたいな感じですよね?(スキル不足な上、話についていけず、すみません(--;

 指定したシートに限定して動かしたいみたいなときは、Sheetに貼り付けをする
 方法みたいなでしょうか。

 でも、ここで深入りしても
 seiyaさまにお手数を掛ける事になるので
 理解できるレベルになったら、またご指導下さい。

 大変、勉強になりました。
ありがとうございました。


 >理解できるレベル....

 もう既に、お分かりいただいたような感じですが?
 分からなかったら、どんどん質問しましょう。私も勉強しますので。
 (seiya)

暖かいお言葉ありがとうございます<(_ _)>

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.