「みんな教えて! 選手権!!」開催のお知らせ

こんばんは。
Excel2003を使用しています。

あるシステムからのデータをCSVで出力、Excelで表示させると、セルの幅が合っていないので、見づらいのですが、これを解消するためにそれぞれの列幅を決めて、マクロで設定したいと思っています。

連続しない列の列幅の設定のコードの書き方がわからないので、教えていただけないでしょうか?ひとつの列や連続した列幅の設定であれば、手元にある参考書でわかるのですが。。。

例えば
A列、C列、D列、G列、I列、J列の列幅を14
B列、F列、H列の列幅を10
に設定するコードはどのように書いたらいいのでしょうか?
マクロ勉強中です。よろしくお願いします。

A 回答 (5件)

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
------------------------------------------------

この回答への補足

おはようございます。
回答ありがとうございます。

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

もし、ご存知なら教えていただけると助かります。
よろしくお願いします。

補足日時:2007/05/17 09:02
    • good
    • 0

>マクロ勉強中です



であればマクロ記録を頻繁にとることをお勧めします。
今回のもコントロールを押しながら、
セル、A1、C1、D1、G1、I1、J1を選択するマクロ記録をとると

  Range("A1,C1:D1,G1,I1:J1").Select

となります。
これで複数選択する方法がわかりますので、自ずと、Wendy02さんの回答のように(変数でとるかどうかは別として)なりますよね。

  Range("A1,C1:D1,G1,I1:J1").ColumnWidth = 14


このようにある程度のことはマクロ記録をとることで分かりますので
頻繁にマクロ記録をとってみることをお勧めします。
 
    • good
    • 0
この回答へのお礼

おはようございます。

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

アドバイスありがとうございました。

お礼日時:2007/05/18 09:25

こんばんは。



通常は、

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
    • good
    • 0
この回答へのお礼

おはようございます。

>マクロというのは、裏方の仕事でワークシートのように「スマート?=スリム」とはいかないものです。

あとで、コードを見直したときにわかりやすいように、「スマート?=スリム」にしておきたいと思ってしまいました。
おっしゃるとおり、マクロの内容は表には出てこないわけですから、結果さえきちんとしていれば、問題ないですね。

ただ、いろんな方から回答をいただくことで、それぞれ違った書き方を拝見できるのは参考になりますし、その質問とは関係ない部分でも、役に立ったこともありましたので、つい補足を投稿してしまった次第です。

貴重なお言葉ありがとうございました<(_ _)>

お礼日時:2007/05/18 09:19

一度に指定する方法はちょっと自分は知らないです。


もしやるなら以下のような方法が普通かと。
----------------------------------------------------
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
------------------------------------------
    • good
    • 0
この回答へのお礼

おはようございます。

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

ありがとうございました。

お礼日時:2007/05/18 09:21

こんにちは。



そういった場合は、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 と全列を回しているのは
どれの列が対象になってもここは変えなくてもいいようにです。

以上です。
 
    • good
    • 0
この回答へのお礼

おはようございます。

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

回答ありがとうございました。

お礼日時:2007/05/18 09:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報