[[20120518101937]] 『マクロ』(ポンジュース) ページの最後に飛ぶ

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

 

『マクロ』(ポンジュース)
 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列の数字でもしたいのですが
 何処を変えればよろしいですか?
 (ポンジュース)


これは失礼しました。
> B列にSheet名の一覧があります。
ですので、
 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

 >慌てますね。 
 >先の相談が解決していないうちに次の事に進もうとされても、 
 >理解しにくいのでは、と心配してしまいます。

 わかりづらくてすいません。

 よろしくお願いします。
 (ポンジュース)

記録マクロですね。
このmacro1は標準モジュールに在る、ということでよろしいですね。

標準モジュールに自動記録で書かれたマクロでの注意点は、
シートを切り替えるような動作が無いときは、どのシートに対しての処理か、
記録されない、という点です。

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列には数字のほかに ○ があります。

 お願いします。

 (ポンジュース)


>同じような事を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.