[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『Sheet1.マクロ名 と保存されてしまいます』(マキ)
ありかたくこちらから頂いたVBAを エディタに貼り付けての疑問なんですが
sub マクロ名() で、名前つけまして そしてワークシートにもどって ツール→マクロで表示されるときに Sheet1.マクロ名 となるのですが、これはどうゆう時になってしまうのですか? 回避方法あるのでしょうか? 以前登録VBAには、「Sheet1.」の部分が出てきません。 VBAのエディタの仕組みを理解出来ていないので 解決がわかりません。 宜しくお願いします。
Excel2003、XP
マクロ名のコードが、Sheet1のモジュールに書かれているからです。 標準モジュールに移せば"Sheet1."は取れます。
が、コードの書かれ方によっては、問題が発生する可能性があります。
(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)
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.