• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルVBAで列幅設定)

エクセルVBAで列幅設定

cj_moverの回答

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.3

こんにちは。お邪魔します。 ちょっと、やりたい事の解釈に迷っていましたが、 何故迷ったのか、の説明から始めます。 とりあえず、添付画像をみてください。 それぞれ1行めの黄色い背景色で示しているのは、 「範囲C:Fの幅」(Excelシート上での絶対幅)を表す比較用のスケールです。 また、半角"0"を21桁、統一して並べているのも比較の為です。 添付画像の仕様(1)と仕様(2)で何が違うかというと、 仕様(1)は、 「範囲C:Fの幅」をピクセルで採ったものを「A列の幅」として適用しています。 対して仕様(2)は、 「範囲C:F各列の表示可能な文字数(によって決まる幅)の合計」を「A列の表示可能な文字数(によって決まる幅)」として適用しています。 仕様(1)は範囲C:F全体の絶対的な幅、 仕様(2)はセルの幅をセル内に表示出来る文字数で解釈した幅の合計です。 元質問でご提示のふたつの例は、どちらも(2)のような結果を返しますが、 "A列の幅を、C~F列の幅に設定"、、、ということだと、ちょっと違うようにも思えたりしました。 仕様(2)のような結果を求めているのであれば、一例めの > Columns("A").ColumnWidth = Columns("C").ColumnWidth + Columns("D").ColumnWidth + Columns("E").ColumnWidth + Columns("F").ColumnWidth のようなやり方で十分、シンプルな記述と言えるように思います。 ちょっと脇に逸れますが、.ColumnWidthについて、 VBAのヘルプでは、 > 列幅の単位は、標準スタイルの 1 文字分の幅に相当します。プロポーショナル フォントでは、数字の 0 の幅が列幅の単位になります。 と説明されています。 Excelの[オプション][基本設定][新しいブックの作成時]の [使用するフォント]と[フォントサイズ]で設定された値によって、返す値が違ってくる、 ということのようです。 という前置きをしておいて、 例えば、自分の仕事環境だと、フォント:「MS P ゴシック」、フォントサイズ:「11」という (ありきたりな)基本設定で(その他の環境も)統一されていたりするので、 簡便さだけを追求して決め打ち的に、ざっくりと手抜きをして、次のような方法もアリなのかも知れません。 (検証不十分かも?ですけれども(^^;)、、、)  仕様(1)   Columns("A").ColumnWidth = (Range("C1:F1").Width * 4 / 3 - 5) / 8  仕様(2)   With Range("C1:F1")     Columns("A").ColumnWidth = (.Width * 4 / 3 - .Columns.Count * 5) / 8   End With 仕様(1)については、もう少し汎用的な例をひとつ。 Range("C1:F1").WidthとRange("A1").Widthでピクセル幅は取得出来るので、 ピクセル幅が同値になるまでループして、 Range("A1").ColumnWidthを繰り返し設定し直す、みたいなこと、昔書いてた覚えがあります。 実際はAPIとか組み合わせた方がいいんでしょうけれど、とりあえず、パラメータは適当に書いています。 こんなアプローチもアルって紹介程度で、、、。 Sub Re8490019jj()   Dim dblTgtWidth As Double   dblTgtWidth = Range("C1:F1").Width   Application.ScreenUpdating = False   With Range("A1")     ' ' 横幅を一旦、小さめに設定     .ColumnWidth = dblTgtWidth * 0.16   '  「4:3画面」なら * 0.117  数値は大き過ぎず適当に     ' ' 横幅を一旦、やや大きめに設定     ' ' 横幅が目標値より小さい間ループして、1/2文字分ずつ横幅を拡げる     Do While dblTgtWidth > .Width       .ColumnWidth = .ColumnWidth + 0.5   '  数値は大き過ぎず適当に     Loop     ' ' 横幅が目標値より大さい間ループして、指定の精度ずつ横幅を狭める     Do While dblTgtWidth < .Width       .ColumnWidth = .ColumnWidth - 0.068    '  数値は小さ過ぎず適当に     Loop   End With   Application.ScreenUpdating = True End Sub (私は印刷関連の扱いが不得手ですので、以下の説明に出てくる"幅"についてはあくまでも  PC画面に表示されたExcelシート上でのお話です。  また、各種PC環境やバージョンの違いについても疎い私です。) 以上、ご参考まで。

emaxemax
質問者

お礼

ありがとうございます。 質問の意図をもっと詳しく書いとけばよかったですね、すみません。 正しくは、列幅というより表示出来る文字数でした。 実は、レイアウトの都合上、どうしても一部の行で複数列を結合した表をつくらなければなりません。そしてそこに自動表示させるのは、計算によって求められらたある値に対応する長文の文字列なのです。 この長文文字列を折り返して表示させるのですが、表示させるのは数種類のうちの1つなので、行の高さをあらかじめ固定できません。 しかし行の高さの自動調整は結合セルでは使えません。そこで同じ行に、結合させる複数列と同じ幅の1列を作って、そこにいったん長文を折り返して表示させ、そこで行の高さの自動調整をかける仕掛けを作っていたのです。

emaxemax
質問者

補足

すみません、以下のようにやってみました。 結合セル(C~F)の各セルColumnWidth合計と一つのセル(M)のColumnWidthは同一です。 フォント種類サイズも同一です。しかし、不完全なものになってしまいます。 Sub test03() Dim c As Range Dim x As Single Dim i As Long For Each c In Range("C1:F1") c.Value = c.ColumnWidth x = x + c.ColumnWidth Next Columns("M").ColumnWidth = x Range("M1").Value = Columns("M").ColumnWidth For i = 2 To 10 Cells(i, "M").Value = Cells(i, "C").Value Next Rows("2:10").AutoFit End Sub

関連するQ&A

  • エクセルのブックを開く度にシートの列幅を指定したいのですが・・・

    稚拙な質問お許しください。 エクセルでブックを開いたときに、すでにシートの列幅が任意の幅になっているよう、VBAで「ThisWorkbook」というところに、 Private Sub Workbook_Open() Sheet1.Columns("a:a").Select Selection.ColumnWidth = 7 Sheet1.Columns("b:b").Select Selection.ColumnWidth = 8 Sheet1.Columns("c:c").Select Selection.ColumnWidth = 10 Sheet1.Columns("e:e").Select end sub といった感じで記述したのですが、「F8」キーで処理の過程をみながら追っていくとどうしても、Eの列を過ぎるとEの列だけでなくそれ以降の列も選択してしまい(シート上に表があるのですが、その表の1番最後の列までです。)、任意の幅に指定できないのですが、原因がよくわかりません。どなたか、お力添えください。

  • エクセルマクロ 同じ操作をする複数の列の記述は?

    列の幅を調整するときに、同じ幅の列をまとめて記述する方法を教えてください。 個別に記述し、やりたいことはできているのですが、まとめて記述する方法が知りたいです。 Columns("A").ColumnWidth = 4.63 '各列の幅を変更 Columns("b").ColumnWidth = 8.38 Columns("C").ColumnWidth = 12.75 Columns("D").ColumnWidth = 6.38 Columns("e").ColumnWidth = 4.13 Columns("F").ColumnWidth = 4.63 Columns("g").ColumnWidth = 8.38 Columns("H").ColumnWidth = 12.75 AとF列=4.63 をどのように記述したらいいのでしょうか

  • Excel VBAで、B列の幅を、既存のグラフの幅に設定したい。

    VBA初心者です。 ワークシート上にグラフを作成した後(例えば「グラフ1」とします)、B列の幅を作成したグラフの幅と同じに設定するには、どのように記述すればよいのしょうか? Columns("B").ColumnWidth = ActiveSheet.Shapes("グラフ1").Width Columns("B").Width = ActiveSheet.Shapes("グラフ1").Width Columns("B").ColumnWidth = ActiveSheet.Shapes("グラフ1").ColumnWidth どれもうまくいきませんでした。よろしくお願いします。

  • Excelにて、列の幅をマクロで変えるには?

    今、提出用の資料作成にて、 従業員の稼動実績を記載した表部分を隠して A3にかたち良く収まるように印刷できるよう列の調整をしようと マクロの記録を行い、下記のようなプログラムを得ました。 ところが、実行すると("U:AD")の部分は隠れているのですが、 それ以外は全て、列の幅が"20"になってしまいます。 一体どのようにすれば列の幅を記載通りに調整できるのでしょうか? お教え下さい。宜しくお願いします。 * * * * * * * * * * * * * * * * * Sub 稼動実績を隠す() ' ' 稼動実績を隠す Macro ' マクロ記録日 : 2007/9/27 ユーザー名 : ######## ' ' Columns("A:M").Select Range("A2").Activate Selection.ColumnWidth = 8 Columns("N:O").Select Selection.ColumnWidth = 16 Columns("P:P").Select Selection.ColumnWidth = 20 Columns("R:T").Select Selection.ColumnWidth = 20 Columns("U:AD").Select Selection.ColumnWidth = 0 Columns("AE:AF").Select Selection.ColumnWidth = 20 Columns("AG:AG").Select Selection.ColumnWidth = 8 Columns("AH:AH").Select Selection.ColumnWidth = 54 Columns("AI:AP").Select Selection.ColumnWidth = 20 Columns("AQ:AQ").Select Selection.ColumnWidth = 8 Columns("AR:AS").Select Selection.ColumnWidth = 20 Range("A2").Select End Sub

  • エクセル VBA

    A1,A2,A3→RAND()*99+1 B1→MAX(A1:A3) Sub test() Worksheets("sheet1").Calculate Dim x As Integer x = Range("B1") Range("C1").Value = x End Sub このように記述すると、B2とC2で結果が変わってしまうのですが、どうしてでしょうか?結果を同じにするにはどうすればいいですか?

  • 【VBA】範囲選択し降順で並び替え

    A列の最初の行から、F列の最終行迄を範囲選択し、C列降順で並べ替えをしたいです。最終行は、C列の最終行を指定します。 下記、「Rangeから始まる行」でエラーとなる為、ご教示宜しくお願いします。 Sub 使用頻度で並べ替え() Dim FastRow As Integer Dim LastRow As Integer FastRow = Cells(1, 1).End(xlDown).Row LastRow = Range("C" & Rows.Count).End(xlUp).Row Range("A & FastRow:F" & LastRow).Sort Columns("C"), xlDescending, Header:=xlNo End Sub

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

    お世話になります。 現況では 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 というような語句で短縮させることが出来るマクロ文を お教えください。

  • エクセルVBA

    A列を基準にBC列が空白ならAの数値を入れて、A>BならB列を更新、A<CならC列を更新 A列が数値以外ならその行をスキップ、という処理をしたいのですが Option Explicit Dim A As Range, B As Range, C As Range Dim i As Long Sub test() For i = 1 To 10 Set A = Cells(i, 1) Set B = A.Offset(0, 1) Set C = A.Offset(0, 2) If IsNumeric(A) Then Else Exit Sub End If If B.Value = "" Then B.Value = A.Value If C.Value = "" Then C.Value = A.Value If A.Value > B.Value Then B.Value = A.Value If A.Value < C.Value Then C.Value = A.Value Next i End Sub とすると数値以外の行の時点で停止してしまいます。 その行を飛ばして次の行に進むにはどうしたらいいのでしょうか?

  • excelのマクロが上手く動作しません

    excel2013で、シートのレイアウトを整えるマクロを以下のように作成しました。 しかし、いざ他のシートで試すと、そのシートと同時に特定のシートにもなぜかマクロが実行されてしまいます。(恐らく作ったときに使っていたシート) どうしたら今見ているシートだけにマクロを実行することができるでしょうか? ActiveWindow.Zoom = 85 ActiveWindow.Zoom = 70 Columns("A:A").ColumnWidth = 10.13 Columns("A:A").ColumnWidth = 10.63 Columns("B:B").ColumnWidth = 6.63 Columns("D:D").ColumnWidth = 20 Columns("D:D").ColumnWidth = 23.75 Columns("D:D").ColumnWidth = 24.63 Columns("E:E").ColumnWidth = 10.38 Range("E1").Select ActiveCell.FormulaR1C1 = "インボイス金額" ActiveCell.Characters(7, 2).PhoneticCharacters = "キンガク" Columns("F:F").Select Selection.Delete Shift:=xlToLeft Columns("G:G").Select Selection.Delete Shift:=xlToLeft Range("H9").Select Columns("G:G").ColumnWidth = 11.38 Columns("I:K").Select Selection.Delete Shift:=xlToLeft Range("J9").Select Columns("I:I").ColumnWidth = 15 Columns("J:J").ColumnWidth = 9.75 Columns("K:K").ColumnWidth = 9.5 Range("L2").Select Columns("L:L").ColumnWidth = 5.5 Columns("O:O").Select Selection.Delete Shift:=xlToLeft Selection.ColumnWidth = 13.88 Columns("P:P").Select Selection.Delete Shift:=xlToLeft Selection.ColumnWidth = 12.13 Selection.ColumnWidth = 13.25 ActiveWindow.ScrollColumn = 2 ActiveWindow.ScrollColumn = 3 ActiveWindow.ScrollColumn = 4 ActiveWindow.ScrollColumn = 5 ActiveWindow.ScrollColumn = 6 ActiveWindow.ScrollColumn = 7 ActiveWindow.ScrollColumn = 8 ActiveWindow.ScrollColumn = 9 ActiveWindow.ScrollColumn = 10 ActiveWindow.ScrollColumn = 11 ActiveWindow.ScrollColumn = 12 Columns("Q:Q").Select Selection.ColumnWidth = 5.5 Columns("S:S").Select Selection.ColumnWidth = 6.75 Columns("T:T").ColumnWidth = 9.75 Columns("Q:T").Select Range("T1").Activate Selection.Style = "Comma [0]" Columns("U:U").Select Columns("V:V").ColumnWidth = 5.5 Columns("V:V").ColumnWidth = 6 Columns("W:Z").Select Selection.Delete Shift:=xlToLeft Columns("X:Z").Select Selection.Delete Shift:=xlToLeft Range("X10").Select Columns("X:X").ColumnWidth = 12.25 Columns("X:X").ColumnWidth = 11.13 Columns("Y:Y").ColumnWidth = 6.75 Columns("Z:Z").ColumnWidth = 11.63 Columns("AA:AA").ColumnWidth = 6.75 Columns("AB:AB").Select Selection.Delete Shift:=xlToLeft Range("AB2").Select Columns("AB:AB").ColumnWidth = 11 Columns("AD:AO").Select Selection.Delete Shift:=xlToLeft Range("AF14").Select Columns("AD:AD").ColumnWidth = 11 Columns("AE:AE").Select Selection.Delete Shift:=xlToLeft Range("AG7").Select Columns("AE:AE").ColumnWidth = 20.38 Columns("AF:AJ").Select Selection.Delete Shift:=xlToLeft ActiveWindow.ScrollColumn = 21 ActiveWindow.ScrollColumn = 1 Rows("2:2").Select ActiveWindow.FreezePanes = True Range("A2").Select ActiveWorkbook.Worksheets("11").Sort.SortFields.Clear ActiveWorkbook.Worksheets("11").Sort.SortFields.Add Key:=Range("D2:D137"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ActiveWorkbook.Worksheets("11").Sort.SortFields.Add Key:=Range("A2:A137"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("11").Sort .SetRange Range("A1:AE137") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .Apply End With End Sub よろしくお願い致します。

  • エクセルVBA FindNextについて

    エクセル2002使用です。 VBAのFindNextメソッドについて教えていただけますでようか?不定期の行ごとに存在する○から△までの表を抽出するために次のようなコードをつくりました。   A  B  C  D 1 ○ × × 2 × × × 3 △ × × 4 5 ○ × × 6 × × × 7 △ × × Sub 表の抜き出し() Dim myr1 as range Dim myr2 as range Dim firstmyr1 as String Set myr1 = Columns("A").Find(What:="○") firstmyr1 =myr1.adress Set myr2 = Columns("A").Find(What:="△") Do  処理・・・・ Set myr1 = Columns("A").FindNext(after:=myr1) Set myr2 = Columns("A").FindNext(after:=myr2) Loop until myr1.adress = firstmyr1 End Sub 上記のようなコードで、処理の後のSetステートメントでFindNextを使うと、A5の○とA7の△を見つけてほしいのに、1回目の処理・・・の後の読み込みでウオッチで見るとmyr1値が△になってしまって2回目の読み込みにいけません。Setステートメントが2つ以上あるときのFindNextメソッドの使い方で何か注意点があるのでしょうか? よろしくお願いします。