• 締切済み

列幅変更文の短縮が出来ますでしょうか?

お世話になります。 現況では C2セルからX2セルに 1 或いは 2 を記入し 1ならば列幅を14 それ以外ならば列幅を0 と表示させる方法として、マクロ入門者の為に下記語句を置いて指示しています。 ActiveSheet.Select IF Ranbe("C2").value=1 then Columns("C").ColumnWidth =14 else Columns("C").ColumnWidth=0 end if 以下D列からX列まで同様の文書を置いてあります。 簡単に Range("C2:X2").select というような語句で短縮させることが出来るマクロ文を お教えください。

みんなの回答

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.3

>変更致しましたら処理中の待ち時間が嘘みたいに短くなりました。  それはおそらく For Each In~Next に変えたためではなく、 Application.ScreenUpdating = False を使ってモニター表示の更新を一旦OFFにしてから処理を行った事による効果だと思います。 【参考URL】  VBA マクロ高速化のために停止すべき3項目 - t-hom’s diary   http://thom.hateblo.jp/entry/2015/08/31/063500  御質問の件では列幅を変えるだけで、自動計算もイベントも元々行われる事がない処理だったため、Application.ScreenUpdating のみを使っております。 >他の数値の例示個所を c に置き換えている形で対象範囲をMyrangeで指定しているのかなと  御質問の件では >C2セルからX2セルに >Range("C2:X2") という具合に、処理の対象としているものが「1直線に並んだ連続したセル範囲」に決められていたため、繰り返し操作のやり方を For~Next で数値を基準にして行うよりも、For Each In~Next を使ってセル範囲を基準に行う様にした方がVBAの構文を組み立てやすかったため、For Each In~Next を使っております。  それから、セル範囲の指定でRange("C2:X2")の代わりにmyRangeを使っていたり、列幅の指定で14の代わりにColumnWなどの変数を使っているのは、VBAの構文の最初に近い辺りでまとめて指定しておく事によって、もしもシートのレイアウト等が変更になり、それらの値も変えなくてはならない様な事になった際に、変更箇所を探さずに済むからです。  また、今回の件では関係ありませんでしたが、もし同じ値を複数個所で使用している様なVBAとなっていた場合には、値を変更しなければならなくなった際に、構文の最初の辺りに設けている「変数に入れておく値を指定している所」だけ、即ちたった1か所だけ変更すれば良いので変更が簡単に行えるというメリットがあります。  それから話は変わりますが、今回は >1ならば列幅を14 という具合に列幅が偶々整数値になっていたため、列幅を指定するための変数ColumnWの変数の型をうっかり ColumnW As Long とLong型(長整数値型)で指定してしまいましたが、列幅の値は例えば8.38などの様に小数部分を含んだ数値となる場合もありますから、 ColumnW As Long となっている箇所を ColumnW As Single か或は ColumnW As Double などの浮動小数点数型に差し替えておいた方が良いと思います。 【参考URL】  Excel VBA(エクセル マクロ) 関数集 変数定義   http://www.d3.dion.ne.jp/~jkondou/excelvba/dim.htm

すると、全ての回答が全文表示されます。
  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.2

 失礼しました。  先ほどの回答では、マクロで処理を行う間、「必要のない途中経過まで表示する事で処理が重くなる事」を避けるために、モニター表示の更新のON/OFFを切り替える働きをさせている Application.ScreenUpdating = の所のTrueとFalseが逆になっていました。 Sub QNo9219429_列幅変更文の短縮が出来ますでしょうか() Dim c As Range, myRange As Range, ColumnW As Long ColumnW = 14 Set myRange = Range("C2:X2") Application.ScreenUpdating = False For Each c In myRange If c.Value = 1 Then c.EntireColumn.ColumnWidth = ColumnW Else c.EntireColumn.ColumnWidth = 0 End If Next c Application.ScreenUpdating = True End Sub

samchan
質問者

お礼

早朝にも拘わらず御丁寧かつピンポイントの御回答を頂戴致しました。 ありがとうございました。 本当に助かりました。 変更致しましたら処理中の待ち時間が嘘みたいに短くなりました。 For Next文の例示が数字ばかりでアレアレ?という状態で泥沼にはまっておりました。 頂戴致しました文章を熟読(?)致しましたら 他の数値の例示個所を c に置き換えている形で 対象範囲をMyrangeで指定しているのかなと構文を容易に理解することができました。 今日張り切って出社できます。 重ね言葉になりますが本当にありがとうございました。 拝

すると、全ての回答が全文表示されます。
  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.1

 その様な場合は For~Next や For Each In~Next 等を使って繰り返し処理をすれば良いのです。 Sub QNo9219429_列幅変更文の短縮が出来ますでしょうか() Dim c As Range, myRange As Range, ColumnW As Long ColumnW = 14 Set myRange = Range("C2:X2") Application.ScreenUpdating = True For Each c In myRange If c.Value = 1 Then c.EntireColumn.ColumnWidth = ColumnW Else c.EntireColumn.ColumnWidth = 0 End If Next c Application.ScreenUpdating = False End Sub 【参考URL】  よねさんのWordとExcelの小部屋 > Excel VBA入門 > 7.繰り返し処理(For~Next、Do~Loop)   http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_for_next.html

すると、全ての回答が全文表示されます。

関連するQ&A