• 締切済み

エクセルマクロ文を 教えてください

お世話になります。 下記マクロ文で各シ-トのV4セル或いはW4セル or X4セルの値が増減値と表示されている場合には、当該シ-トは当該セル列と前2列の幅を0にする目的で記載したのですが、ステップインでは全く処理を行っていない形となっております。 初心者のため教則本を横に置いて作成したのですが所与目的を達成させる正しいマクロ文を お教えいただけますよう御願いいたします。 Application.ScreenUpdating = False Worksheets("表紙").Visible = True Worksheets("表紙").Select Dim sht As Worksheet For Each sht In Worksheets Range("V4").Select If Range("V4").Value = "増減値" Then Range("T4:V4").ColumnWidth = 0 End If If Range("W4").Value = "増減値" Then Range("U4:W4").ColumnWidth = 0 End If Range("X4").Select If Range("X4").Value = "増減値" Then Range("V4:X4").ColumnWidth = 0 End If Next Worksheets("表紙").Activate Worksheets("表紙").Select Range("A1").Select Application.EnableEvents = True Application.Interactive = True Application.ScreenUpdating = True End Sub

みんなの回答

回答No.11

>With sht と Select との間に置くマクロ文をどのようにしたら コンパイルエラ-を起こさずに 「Selectの頭に付いてるピリオド」もちゃんと打ち込んでください。 >sht と range との間にピリオドを入れてデバッグ処理を致しましたら最初の sht.range("v4").select の個所で実行エラ-1004 rengeクラスのselectメソッド失敗しました と 元々あった「.Select」がどっかに消えちゃってますよ。シートそのものをセレクト状態にしないで、Range(セル)をセレクトしようとしても「セレクトしようとセルがあるシートがセレクトされてない」ので、エラーになります。 「.Select」は「Select」とは違います。「先頭にピリオドが付いている」のが見えませんか?(見えないなら、眼科に行くか、眼鏡を着用しましょう。プログラムを打ち込む時に「ピリオドが見えない」ってのは致命的です) 「目で見た回答を書き写す」のではなく「回答が書いてあるブラウザ画面の文字を範囲指定して、コピーして、ExcelのVBAエディタにペースト」しましょう。「コピペ」なら「見えない文字があっても、そのままコピーされます」からね。

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.10

回答No.2です。 最初(第1行目)に「Sub 列隠蔽()」があれば、その「Sub」に対する、「End Sub」がなければなりません。 例えば、「For i = 1 to ~」には「Next」がひとかたまりです。 従って、 For i = 1 to 9 For j = 1 to 9 Next j Next i というように、「For i = 1 to 9」~「Next i」の中に「For j = 1 to 9」~「Next j」があります。 こうすることによって、「i」が1のとき、「j」が1~9まで変化し、次に、「i」が2のとき、また、「j」が1~9まで変化する・・・を繰り返します。 「九九」を考えてみてください。 「1×1」「1×2」「1×3」・・・「9×7」「9×8」「9×9」となりますよね。 上記の「i」にあたるのが、前の数字、「j」にあたるのが、×の後ろの数字です。 これと同じで、「Sub ~」と、「End Sub」は一対ですので、「Sub ~」が2つあって、「End Sub」が1つ、ということはあり得ません。 ただ、「For Next」は、上記のように、中に入ります。 For i = 1 to 9の中にFor j = 1 to 9~Next jがあって、Next i。 If ~ Then End If も同じで、 If A Then   If B Then   End If End If というように、中に中に、入るのに対して、 「Sub~End Sub」は通常、中には入りません。 全く別の処理ですので、 Sub A   Aの処理 End Sub Sub B   Bの処理 End Sub というように、独立しています。 Sub AからBを呼び出すのは、 Call B とします。 値を渡すこともできます。 詳しくは、ネットで調べてください。 ここで説明するのは、大変すぎます。 次に、「Option Explicit」の「Explicit」は「明確に」とか「曖昧さなく」というような意味で、「曖昧さのない」というオプションで、プログラムを書きます、というような意味です。 従って、「Sub~」の上、プログラム(マクロ)を書き始める最初になければなりません。 また、分からないのは、 ActiveWorkbook.Unprotect Password:="123456" です。 「ActiveWorkbook」ということは、ファイルは開いている、ということです。 開いているファイル(ワークブック)は、すでにプロテクトは外れています。 ファイル(ワークブック)を開くときに、「Password」を指定して、VBAから開くのなら、分かりますが、すでに開いてしまっているファイルは、パスワードは解除ずみです。 ActiveWorksheet.Unprotect Password:="123456" なら、意味が分かります。 ただ、ゆっくり考えてくださいね。 ファイル(ワークブック)にパスワードをつけているのですか? それとも、ファイルは、ダブルクリックするだけで開くが、シートにパスワードが設定されていて、編集ができない状態なのですか? もし、シートにパスワードが設定されていて、編集できない状態であれば、 Sub 列隠蔽() ActiveWorkbook.Unprotect Password:="123456" Application.EnableEvents = False Application.Interactive = False Application.EnableCancelKey = xlDisabled Application.ScreenUpdating = False Worksheets("表紙").Visible = True Worksheets("表紙").Select この部分を削除し、 Sub Test() の次の行に ActiveWorkbook.Unprotect Password:="123456" もう一度念を押しますが、上記1行を追加するのは、「シート」にパスワードが設定されている場合です。 ワークブックにパスワードが設定されている場合は、この1行も不要です。

noname#231195
noname#231195
回答No.9

他の方とのやり取りに横から失礼しますが、 >OptionExplicitの個所でコンパイルエラ-プロシ-ジャ-内では無効ですと表示されました。 Option Esplicit はSub文の前に置きます。エラーメッセージの通りプロシージャ(SubからEnd Subまで)内では無効です。 >Subtest()の個所では Endsubが必要ですと表示されました。 (-ω-;)ウーン。Sub~End Subが一つのプロシージャですから、そのなかにSub文が入っているのは何かが間違えているのです。そういうことをエラーメッセージは伝えています。 これらを直すと、このコードはこうなります。 Option Explicit Sub 列隠蔽() ActiveWorkbook.Unprotect Password:="123456" Application.EnableEvents = False Application.Interactive = False Application.EnableCancelKey = xlDisabled Application.ScreenUpdating = False Worksheets("表紙").Visible = True Worksheets("表紙").Select Dim i As Integer For i = 1 To Worksheets.Count Worksheets(i).Select If Range("V4").Value = "増減値" Then Range("T:V").ColumnWidth = 0 End If If Range("W4").Value = "増減値" Then Range("U:W").ColumnWidth = 0 End If If Range("X4").Value = "増減値" Then Range("V:X").ColumnWidth = 0 End If Next i Worksheets("表紙").Activate Worksheets("表紙").Select Range("A1").Select Application.EnableEvents = True Application.Interactive = True Application.ScreenUpdating = True End Sub インタラクティブモードなんかFalseにしていいんですかねぇ。 せめてバグフィックスしてからFalse にしたほうがいいような希ガス。 暴走したらとまらなくなるんじゃないだろうか???

noname#231195
noname#231195
回答No.8

あっ 、With-End With でくくっていたんですか。気がつきませんでした。 それじゃ、下のコードをそのまま Sub - End Sub の間にコピペして使ってください。 私流にすこし手を加えてあります。 Dim sht As Worksheet For Each sht In Worksheets With sht If .Name <> "表紙" Then If .Range("V4").Value = "増減値" Then .Range("T4:V4").ColumnWidth = 0 End If If .Range("W4").Value = "増減値" Then .Range("U4:W4").ColumnWidth = 0 End If If .Range("X4").Value = "増減値" Then .Range("V4:X4").ColumnWidth = 0 End If End If End With Next Worksheets("表紙").Select Range("A1").Select なお、Application.Screenupdate をFalseにしておいた方が早いですよ。 30シートくらいならわからないかもしれませんが、大量のデータを処理するときはその差が目に見えます。

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.7

回答No.2です。 複数あるすべてのシートに対して同じことを行うのでしたら、 Option Explicit Sub Test() Dim i As Integer For i = 1 To Worksheets.Count Worksheets(i).Select If Range("V4").Value = "増減値" Then Range("T:V").ColumnWidth = 0 End If If Range("W4").Value = "増減値" Then Range("U:W").ColumnWidth = 0 End If If Range("X4").Value = "増減値" Then Range("V:X").ColumnWidth = 0 End If Next i End Sub 一応説明です。 「Option Explicit」があると、「Dim」で宣言していない変数を使うと、エラーになります。 すなわち、使う変数は、必ず「Dim」で宣言しておかなければならなくなります。 「Worksheets.Count」というのは、そのファイル(ワークブック)が持っているシートの数です。 最初(左端)のシートから順番に同じことをしているだけです。 勉強、がんばってください。

samchan
質問者

補足

御教授ありがとうございます。 下記マクロ文をおきましたらOptionExplicitの個所でコンパイルエラ-プロシ-ジャ-内では無効ですと表示されました。 Subtest()の個所では Endsubが必要ですと表示されました。 再三で恐縮でございますが下記マクロ文の変更訂正個所を御指示いただけますよう御願いいたします。 Sub 列隠蔽() ActiveWorkbook.Unprotect Password:="123456" Application.EnableEvents = False Application.Interactive = False Application.EnableCancelKey = xlDisabled Application.ScreenUpdating = False Worksheets("表紙").Visible = True Worksheets("表紙").Select Option Explicit Sub Test() Dim i As Integer For i = 1 To Worksheets.Count Worksheets(i).Select If Range("V4").Value = "増減値" Then Range("T:V").ColumnWidth = 0 End If If Range("W4").Value = "増減値" Then Range("U:W").ColumnWidth = 0 End If If Range("X4").Value = "増減値" Then Range("V:X").ColumnWidth = 0 End If Next i Worksheets("表紙").Activate Worksheets("表紙").Select Range("A1").Select Application.EnableEvents = True Application.Interactive = True Application.ScreenUpdating = True End Sub

noname#231195
noname#231195
回答No.6

>shtRange("V4").Select ピリオドが抜けています。 sht.Range("V4").Select です。 #3の方の書かれたように、Range("V4").Select だけですと、アクティヴなシートの上のV4を選択します。今の場合で言えば"表紙" がアクティヴなシートです。 おそらく表紙の上には、増減値という項目名がないんだと思います。だから、元のマクロは走るけれども何もしないのです。 sht.で、それぞれのシートの上のセルV4だと指定するわけです。

samchan
質問者

補足

幾度も申し訳ございません。 sht と range との間にピリオドを入れてデバッグ処理を致しましたら最初の sht.range("v4").select の個所で実行エラ-1004 rengeクラスのselectメソッド失敗しました と 表示されました。御指摘の通りシ-ト表紙には増減値という項目は無く単にマクロを記録したボタンを置いてあるだけでございます。 追加するマクロ文或いは変更するマクロ語句を御指示いただけますれば幸甚でございます。 Worksheets("表紙").Select Dim sht As Worksheet For Each sht In Worksheets If sht.Name <> "表紙" Then With sht sht.Range("V4").Select If sht.Range("V4").Value = "増減値" Then sht.Range("T4:V4").ColumnWidth = 0 End If If sht.Range("W4").Value = "増減値" Then sht.Range("U4:W4").ColumnWidth = 0 End If sht.Range("X4").Select If Range("X4").Value = "増減値" Then sht.Range("V4:X4").ColumnWidth = 0 End If End With End If Next Worksheets("表紙").Activate Worksheets("表紙").Select Range("A1").Select

noname#231195
noname#231195
回答No.5

横から失礼します。 要するに Range("xxxx") としてあるところを、 全部 sht.Range("xxxx") に替えればいいのです。 8か所、かな?

samchan
質問者

補足

御指導ありがとうございます。 下記マクロ文でコンパイルエラ-が最初のshtRange("V4").Select部分で表示されました。 お手間を掛けて申し訳ないのですが再度御教授いただけますよう 御願いいたします。 Dim sht As Worksheet For Each sht In Worksheets If sht.Name <> "表紙" Then With sht shtRange("V4").Select If shtRange("V4").Value = "増減値" Then shtRange("T4:V4").ColumnWidth = 0 End If If shtRange("W4").Value = "増減値" Then shtRange("U4:W4").ColumnWidth = 0 End If shtRange("X4").Select If Range("X4").Value = "増減値" Then shtRange("V4:X4").ColumnWidth = 0 End If End With End If Next

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.4

回答No.2です。 追伸です。 Application.ScreenUpdating = False こんな1行は全く不要です。 (ネットで調べてみてください) Worksheets("表紙").Visible = True 「表紙」というワークシートを表示しています。 Worksheets("表紙").Select そのワークシートを選んでいます。 Dim sht As Worksheet For Each sht In Worksheets ここが、問題です。 ワークシート「表紙」を選んでいるのに、 どうして、ワークシートを順番に処理するのか? もし、ワークシートが複数存在して、 それらすべてのワークシートに対して 処理を行うのなら、 ワークシートをセレクトする必要はありません。 (“Worksheets("表紙").Select”は不要です) 逆に、ワークシートが「表紙」1つなら、 「For Each~In」が、不要です。 また、ワークシートが「表紙」1つなら、 セレクトする必要もありません。 Range("V4").Select これも必要ありません。 下で「Range("V4").Value~」としているのですから、 セレクトしなくてもいいのです。 If Range("V4").Value = "増減値" Then Range("T4:V4").ColumnWidth = 0 列を処理するので、「T4:V4」ではなく、 「T:V」でいいのです。 End If もし、「Range("V4").Select」が必要なら、 ここにも、「Range("W4").Select」が必要なはずです。 If Range("W4").Value = "増減値" Then Range("U4:W4").ColumnWidth = 0 End If Range("X4").Select If Range("X4").Value = "増減値" Then Range("V4:X4").ColumnWidth = 0 End If Next Worksheets("表紙").Activate Worksheets("表紙").Select Range("A1").Select 上記3行は、全く意味がありません。 だいたい、「Active」にした時点で、 「Select」しているのと同じです。 最初にも言いましたが、 複数シートが存在するのですか? Application.EnableEvents = True Application.Interactive = True Application.ScreenUpdating = True 上記3行も、全く必要ありません。 もちろん、まだ、意味が分かっておられないので、仕方ない部分はあると思いますが、しなくてもいいことを、イチイチ、念のためにしておられるように見えます。 最初は、より単純に、よりシンプルにマクロを組むことを心がけてください。

samchan
質問者

補足

御叱責ありがとうございました。 シ-ト枚数が単一でしたら楽なのですがチェックするシ-ト枚数は約30枚になります。 枚数が僅少であれば当該シ-ト名を置いて処理するのですが枚数が多いため難儀しております。 当該対象シ-トを順番にチェック及び列幅変更するマクロ文を御教授ください。

回答No.3

因みに。 Range("V4").Select If Range("V4").Value = "増減値" Then と実行した場合は Range("V4").Select も If Range("V4").Value = "増減値" Then も「現在アクティブなシート」に対しての処理になります。 従って Dim sht As Worksheet For Each sht In Worksheets は「まったく無意味な行」になってしまいます。 なお、質問文のマクロは「アクティブシートを指定してない」ですから「現在アクティブなシートがどこになっているかで、動作が変わる」ので、事実上「何が起こるか判らない」です。 以下の例を良く見て下さい。 Sheets("Sheet1").Activate With Sheets("Sheet2") Range("A1") = .Range("B2") End With このプログラムの「Range("A1")」は「現在アクティブなシートのA1」になります。つまり「Sheet1のA1」です(「Sheets("Sheet1").Activate」でSheet1をアクティブにしている事に注目して下さい) ですが「.Range("B2")は「Withで指定したオブジェクトのB2」になります。つまり「Sheet2のB2」です(「With Sheets("Sheet2")」でSheet2をWithに指定している事に注目して下さい) このように「.(ピリオド)の有る無し」で「作用対象が別の物になってしまう」のです。

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.2

極めて単純には、 Option Explicit Sub Test() If Range("V4").Value = "増減値" Then Range("T:V").ColumnWidth = 0 End If If Range("W4").Value = "増減値" Then Range("U:W").ColumnWidth = 0 End If If Range("X4").Value = "増減値" Then Range("V:X").ColumnWidth = 0 End If End Sub だけだと思われます。 “Worksheets”は、いくつあるのですか? もし、「表紙」というWorksheets1つだけなら、上のマクロで十分です。

関連するQ&A

専門家に質問してみよう