Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
  • ベストアンサー

【Excel VBA】列幅の設定

こんばんは。 Excel2003を使用しています。 あるシステムからのデータをCSVで出力、Excelで表示させると、セルの幅が合っていないので、見づらいのですが、これを解消するためにそれぞれの列幅を決めて、マクロで設定したいと思っています。 連続しない列の列幅の設定のコードの書き方がわからないので、教えていただけないでしょうか?ひとつの列や連続した列幅の設定であれば、手元にある参考書でわかるのですが。。。 例えば A列、C列、D列、G列、I列、J列の列幅を14 B列、F列、H列の列幅を10 に設定するコードはどのように書いたらいいのでしょうか? マクロ勉強中です。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • ape5
  • ベストアンサー率57% (85/148)
回答No.1

2通りあります。 (1)は各列の中で一番幅を取るセルの大きさに合わせて自動的に幅が設定されます。 (2)は各列の幅を直接指定してやる方法です。 ----------------------------------------------- (1) Worksheets(1).Range("A:D").EntireColumn.AutoFit (2) With Worksheets(1)  .Range("A1").ColumnWidth = 3  .Range("B1").ColumnWidth = 10  .Range("C1").ColumnWidth = 12  .Range("D1").ColumnWidth = 5 End With ------------------------------------------------

rx-z5815
質問者

補足

おはようございます。 回答ありがとうございます。 (1)の方法は、手元の参考書にも記載されていましたが、これだと不都合な点があるので、(2)の方法でいきたいと思います。 ひとつの列や連続した列の列幅を指定する書き方はわかるのですが、質問文中の例に挙げたような連続しないセルの列幅が同じ場合でも、ひとつずつ書く方法しかないのでしょうか? (コンマで区切る?などして、まとめて書けないのでしょうか?) もし、ご存知なら教えていただけると助かります。 よろしくお願いします。

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

その他の回答 (4)

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.5

>マクロ勉強中です であればマクロ記録を頻繁にとることをお勧めします。 今回のもコントロールを押しながら、 セル、A1、C1、D1、G1、I1、J1を選択するマクロ記録をとると   Range("A1,C1:D1,G1,I1:J1").Select となります。 これで複数選択する方法がわかりますので、自ずと、Wendy02さんの回答のように(変数でとるかどうかは別として)なりますよね。   Range("A1,C1:D1,G1,I1:J1").ColumnWidth = 14 このようにある程度のことはマクロ記録をとることで分かりますので 頻繁にマクロ記録をとってみることをお勧めします。  

rx-z5815
質問者

お礼

おはようございます。 マクロの記録…すっかり忘れていました(^_^;) おっしゃるとおり、マクロの記録を利用すれば、ある程度のことは分かりますよね。 アドバイスありがとうございました。

すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんばんは。 通常は、 UsedRange で、列それぞれを、AutoFit させてしまうのが早いと思いますね。 ただ、#1/#3 さんの書いたとおりで、何の問題もないと思うのですが。 >ひとつずつ書く方法しかないのでしょうか?(コンマで区切る?などして、まとめて書けないのでしょうか?) それは、可能なのですが、マクロというのは、裏方の仕事でワークシートのように「スマート?=スリム」とはいかないものです。だから、その内容がどんなに複雑で書くのは大変だとしても、それ自体は表に出てこないのですから、あまり、そういうことは、考えないほうがよいと思います。マクロの勉強中でしたら、そうしたコードを、何百、何千と書いていく上で、経験として身についていくものなのだと思うのです。 VBAの究極の求められるものは、単なる出てきた結果にしか過ぎませんから、#3 のコードと優劣なんて存在しないことだけは分かってくださいね。 Sub ColumnWidthsArrange() 'A列、C列、D列、G列、I列、J列の列幅を14  Const W14 As String = "A1,C1,D1,G1,I1,J1" 'B列、F列、H列の列幅を10  Const W10 As String = "B1,F1,H1"  Range(W14).ColumnWidth = 14  Range(W10).ColumnWidth = 10 End Sub

rx-z5815
質問者

お礼

おはようございます。 >マクロというのは、裏方の仕事でワークシートのように「スマート?=スリム」とはいかないものです。 あとで、コードを見直したときにわかりやすいように、「スマート?=スリム」にしておきたいと思ってしまいました。 おっしゃるとおり、マクロの内容は表には出てこないわけですから、結果さえきちんとしていれば、問題ないですね。 ただ、いろんな方から回答をいただくことで、それぞれ違った書き方を拝見できるのは参考になりますし、その質問とは関係ない部分でも、役に立ったこともありましたので、つい補足を投稿してしまった次第です。 貴重なお言葉ありがとうございました<(_ _)>

すると、全ての回答が全文表示されます。
  • ape5
  • ベストアンサー率57% (85/148)
回答No.3

一度に指定する方法はちょっと自分は知らないです。 もしやるなら以下のような方法が普通かと。 ---------------------------------------------------- With Worksheets(1) .Range("A1").ColumnWidth = 14 .Range("C:D").ColumnWidth = 14 .Range("G1").ColumnWidth = 14 .Range("I:J").ColumnWidth = 14 .Range("B1").ColumnWidth = 10 .Range("F1").ColumnWidth = 10 .Range("H1").ColumnWidth = 10 End With ------------------------------------------ ちょっとトリッキーなのは以下のような方法もあるかと思います。 下の例だとE列は幅が14になりますが、そこは自分で指定してください。 ------------------------------------------ With Worksheets(1) .Range("A:J").ColumnWidth = 14 .Range("B1").ColumnWidth = 10 .Range("F1").ColumnWidth = 10 .Range("H1").ColumnWidth = 10 End With ------------------------------------------

rx-z5815
質問者

お礼

おはようございます。 再度の回答ありがとうございます。 丁寧に説明してくださり、助かりました。 ありがとうございました。

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

こんにちは。 そういった場合は、Select Caseステートメントがいいかも知れませんね。 ●(処理内容)   A、C、Eの列幅を 14   B,D、Fの列幅を 10 列番号を数字で扱うか、見た目の通り文字で扱うかでコードがちょと違います。 (1)列番号を数字(左から、1,2,3・・)で処理する方法 ---------------------------------------------------------- Sub Test222()   Dim Clm As Integer      For Clm = 1 To 256     Select Case Clm       Case 1, 3, 5         Columns(Clm).ColumnWidth = 14       Case 2, 4, 6         Columns(Clm).ColumnWidth = 10       Case Else     End Select   Next Clm End Sub ---------------------------------------------------------- (2)列番号を文字(A,B,C・)で処理する方法 ----------------------------------------------------------- Sub Test333()   Dim Clm As Integer   Dim Moji As String   For Clm = 1 To 256     Moji = Columns(Clm).Address(False, False)     Moji = Left(Moji, InStr(Moji, ":") - 1)     Select Case Moji       Case "A", "C", "E"         Columns(Moji).ColumnWidth = 14       Case "B", "D", "F"         Columns(Moji).ColumnWidth = 10       Case Else     End Select   Next Clm End Sub ------------------------------------------------------------ 上記からもお分かりのように (2)の列番号を文字(A,B,C・・)で扱う方が どの列を処理してるか一目瞭然なのでベターかな、と。 それから、For Clm = 1 to 256 と全列を回しているのは どれの列が対象になってもここは変えなくてもいいようにです。 以上です。  

rx-z5815
質問者

お礼

おはようございます。 丁寧に説明していただき、ありがとうございます。 Select Case は、参考書等で目にしたことはありますが、あまり使用したことがなかったので、勉強になりました。 回答ありがとうございました。

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

関連するQ&A