[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『マクロ』(ポンジュース)
B列にSheet名の一覧があります。 E列には1〜10の数字が入力されています。 そのうちE列に3と入力されているB列のSheetに同じマクロを使いたいです A B C D E 1 Sheet2 1 2 Sheet3 3 3 Sheet4 2 4 Sheet5 3
この場合ボタンを押すと Sheet3と Sheet5に同じマクロをつかいたいです。 お願いします。 (ポンジュース)
dim c as range,sh as worksheet
for each c in Range("A1:A5")
set sh = worksheets(c.value)
select case c.offset(0,3).value
case is = 1
msgbox sh.name
case is = 2
msgbox sh.name
case is = 3
msgbox sh.name
case else
end select
next c
msgbox sh.name のところを
それぞれE列の数字に応じた処理に置き換えます。
(みやほりん)(-_∂)b
(みやほりん)さん、回答ありがとうございます。
Set sh = Worksheets(c.Value)の所でエラーがでてしまいます。
>msgbox sh.name のところを >それぞれE列の数字に応じた処理に置き換えます。
Macro1を実行する場合はどのように置き換えたらいいですか?
また、同じような事をF列の数字でもしたいのですが 何処を変えればよろしいですか? (ポンジュース)
for each c in Range("A1:A5")
を
for each c in Range("B1:B5")
に訂正してください。
ちなみに、「エラーが出る」だけでなくて、
「エラーメッセージ」を書いていただけると、解決はより早くなります。
> Macro1を実行する場合はどのように置き換えたらいいですか?
たとえば、testというプロシージャからmacro1を単に呼び出すのなら、
sub test1() call macro1 end sub
のような書き方をします。
が、実際にはmacro1がどんな処理をシテイルのかにもよりますので、
同様の書き方をして期待する処理が出来るかどうかは保証できません。
(要するに、ご自身で作ったマクロをさらけ出してください、ということです)
> また、同じような事をF列の数字でもしたいのですが
慌てますね。
先の相談が解決していないうちに次の事に進もうとされても、
理解しにくいのでは、と心配してしまいます。
今進めているコードの理屈を理解していただければ、自然に
応用が出来ると思われますが、いかがでしょうか。
(みやほりん)
(みやほりん)さん、回答ありがとうございます。
>ちなみに、「エラーが出る」だけでなくて、 >「エラーメッセージ」を書いていただけると、解決はより早くなります。
実行時エラー’9’ インデックスが有効範囲にありません
と出ます。
>(要するに、ご自身で作ったマクロをさらけ出してください、ということです)
少し長いですけど
Sub Macro1() ' ' Macro1 Macro '
'
Range("AS12:AY12").Select
Selection.Copy
Range("BA12:BG12").Select
ActiveSheet.Paste
Range("AS14:AY14").Select
Application.CutCopyMode = False
Selection.Copy
Range("BA14:BG14").Select
ActiveSheet.Paste
Range("AS18:AY18").Select
Application.CutCopyMode = False
Selection.Copy
Range("BA18:BG18").Select
ActiveSheet.Paste
Range("AS20:AY20").Select
Application.CutCopyMode = False
Selection.Copy
Range("BA20:BG20").Select
ActiveSheet.Paste
Range("AS23:AY23").Select
Application.CutCopyMode = False
Selection.Copy
Range("BA23:BG23").Select
ActiveSheet.Paste
Range("AS25:AY25").Select
Application.CutCopyMode = False
Selection.Copy
Range("BA25:BG25").Select
ActiveSheet.Paste
Range("AS27:AY27").Select
Application.CutCopyMode = False
Selection.Copy
Range("BA27:BG27").Select
ActiveSheet.Paste
Range("AS30:AY30").Select
Application.CutCopyMode = False
Selection.Copy
Range("BA30:BG30").Select
ActiveSheet.Paste
Range("AS32:AY32").Select
Application.CutCopyMode = False
Selection.Copy
Range("BA32:BG32").Select
ActiveSheet.Paste
Range("AS34:AY34").Select
Application.CutCopyMode = False
Selection.Copy
Range("BA34:BG34").Select
ActiveSheet.Paste
Range("AS37:AY37").Select
Application.CutCopyMode = False
Selection.Copy
Range("BA37:BG37").Select
ActiveSheet.Paste
Range("AS39:AY39").Select
Application.CutCopyMode = False
Selection.Copy
Range("BA39:BG39").Select
ActiveSheet.Paste
Range("AS41:AY41").Select
Application.CutCopyMode = False
Selection.Copy
Range("BA41:BG41").Select
ActiveSheet.Paste
Range("AS44:AY44").Select
Application.CutCopyMode = False
Selection.Copy
Range("BA44:BG44").Select
ActiveSheet.Paste
Range("AS46:AY46").Select
Application.CutCopyMode = False
Selection.Copy
Range("BA46:BG46").Select
ActiveSheet.Paste
Range("AS48:AY48").Select
Application.CutCopyMode = False
Selection.Copy
Range("BA48:BG48").Select
ActiveSheet.Paste
Range("AS50:AY50").Select
Application.CutCopyMode = False
Selection.Copy
Range("BA50:BG50").Select
ActiveSheet.Paste
Range("AS52:AY52").Select
Application.CutCopyMode = False
Selection.Copy
Range("BA52:BG52").Select
ActiveSheet.Paste
Range("AS56:AY56").Select
Application.CutCopyMode = False
Selection.Copy
Range("BA56:BG56").Select
ActiveSheet.Paste
Range("AS58:AY58").Select
Application.CutCopyMode = False
Selection.Copy
Range("BA58:BG58").Select
ActiveSheet.Paste
Range("AS60:AY60").Select
Application.CutCopyMode = False
Selection.Copy
Range("BA60:BG60").Select
ActiveSheet.Paste
Range("AS62:AY62").Select
Application.CutCopyMode = False
Selection.Copy
Range("BA62:BG62").Select
ActiveSheet.Paste
Application.CutCopyMode = False
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
IgnorePrintAreas:=False
End Sub
>慌てますね。 >先の相談が解決していないうちに次の事に進もうとされても、 >理解しにくいのでは、と心配してしまいます。
わかりづらくてすいません。
よろしくお願いします。 (ポンジュース)
標準モジュールに自動記録で書かれたマクロでの注意点は、
シートを切り替えるような動作が無いときは、どのシートに対しての処理か、
記録されない、という点です。
Rangeオブジェクトの親(Worksheetオブジェクト)が省略されているときは
アクティブなシートに対して処理が行われる、という点に注目してください。
sub test1() call macro1 end sub
でmacro1を呼び出すことは出来ますが、その呼び出した時点にアクティブなシート
に対してmacro1が実行されます。
>ボタンを押すと
と在りますので、ワークシートにフォームのボタンなどを配置するのだと推測します。
ボタンを押しても、ボタンを配置したシートがアクティブなままでは、
ボタンを配置したシートに対してmacro1が実行されてしまう、ということです。
macro1をE列が「3」と成っているシートに対して実行したい、ということなのだと
推測しますが、macro1を実行する前に、対象のシートをアクティブにする、という
処理が必要になります。
シート名一覧のあるシートにフォームツールバーのボタンを配置しているとします。
下記のマクロを標準モジュールに登録してあるとします。
ボタンに下記マクロを登録するとします。
sub test()
dim c as range,sh as worksheet
for each c in Range("B1:B4")
set sh = worksheets(c.value)
select case c.offset(0,3).value
case is = 1
case is = 2
case is = 3
sh.activate
call macro1
case else
end select
next c
end sub
上記はE列が3のシートに対して、macro1を実行すると思いますので、試してください。
念のため、ファイルもバックアップしておいてください。
また、同時に下記のポイントを参考にmacro1のコードの整理もしてみてください。
【1】
Application.CutCopyMode = False
は不要ですので、全て削除してください。
これはCutCopyMode (セルを切り取り、コピーしたときにセルが点滅破線で囲まれる状態)
を解除するものですが、次のコピー動作で自動的に解除されます。
【2】
Range("AS12:AY12").Select
Selection.Copy
Range("BA12:BG12").Select
ActiveSheet.Paste
前記【1】の後にはこの4行のパターンが続きますが、これは次のように書き換えることが出来ます。
Range("AS12:AY12").Copy Range("BA12:BG12")
この2点に準じて整理するだけで、ずいぶんすっきりとすると思います。
(みやほりん)
みやほりんさん返事が遅くなってすいません。 やはりSet sh = Worksheets(c.Value)の所でエラーがでてしまいます。
また、長いマクロの件、大変勉強になります。 マクロは最近勉強を始めた所ですのでよろしくお願いします。 (ポンジュース)
横から失礼
コード全体は読んでいないけど、このコードで 9 のインデックスエラーがでるということは指定したシートがないということ。 エラーになってとまった時、黄色く光っている Set sh = Worksheets(c.Value) この c.Value にマウスをあてると どんな値が浮かび上がるかな? これが今セットしようとしているシートのシート名なんだけど、そのシートがないよということ。
(ぶらっと)
ぶらっとさん、回答ありがとうございます。
>エラーになってとまった時、黄色く光っている Set sh = Worksheets(c.Value) この c.Value にマウスをあてると >どんな値が浮かび上がるかな?
c.Value = Empty 値 と出ます。
B列のシート名と同じ名前のシートはあります。 B列のシート名にハイパーリンクの設定がされてるから駄目なのでしょうか? (ポンジュース)
Set sh = Worksheets(c.Value)
ですが、変数shに格納すべきWorksheetsオブジェクトが c.Value では
取得できない、ということです。
で、 c はなにか、というと、Range("B1:B4")で取得できる中のどれかのセルです。
これは「シート名が書いてあるセル範囲」ですね。
すぐに思い当たる原因は、
[1]マクロを実行するとき、このシート名のリストを書いているシートがアクティブでない。
[2]Range("B1:B4")に書かれているシート名と、実際のシート名が一致していない。
[3]シート名と関係ない文字列がRange("B1:B4")に書かれている、もしくは、
実際には違う範囲だがこの部分のセル範囲を修正せずに使用している
のどれか。
とくにシート名は全角半角の区別、スペース文字列の存在などを気にする必要があります。
> c.Value = Empty 値 と出ます。
だとすると、[1]か[3]かな?
(みやほりん)(-_∂)b
みやほりんさん、回答ありがとうございます。 B列にはいくつか空白のセルがありそれがエラーの原因でした。 空白をなくしたらできました。
また、同じような事をF列でもしたいのですが 何処を変えたらよろしいですか? F列には数字のほかに ○ があります。
お願いします。
(ポンジュース)
E列を表現している部分は下記。
select case c.offset(0,3).value
:
:
End Select
cは Range("B1:B4")の中のセルをループして、ひとつずつ処理しています。
c.offset(0,3)は c を基準に0行下(同じ行)で3列右側のセル。
c(B列のセル)から見て3列右側のセルだから、E列ですね。
c(B列のセル)から見てF列は何列右側にあるか、ということを考えて
応用してください。
VBEのコードウィンドウで編集カーソルをキーワードの中において
ファンクションキーのF1を押すと、そのキーワードについての
ヘルプにショートカットしますので活用してみて下さい。
(みやほりん)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.