よろしくお願いします。いつもgooの皆さんには大変お世話になっております
エクセルは2013です
私のマクロはIF文が多いだけでなく、IFの中にIFが有って、コメントを
いっぱい書かないと後でわからなくなります
下記のマクロは列をAutoFitするマクロで、一応狙った動きをしています
このマクロ(IFの連続)は、うまい人が書けばもっとスマートになりますか?
処理する列が飛び飛びなので無理そうな感じもしますが、もっと簡単に書けるようでしたら
どなたか添削お願いできませんでしょうか
なお、ここでは、左の余白が有るのですが、「確認画面」になると、余白がなくなって
見にくくなっています
この原因も教えていただけると大変助かります
For i = 2 To 34 'B列からAH列まで
'FR:43行(データ行の一番上) LR:73行(データ行の一番下)
' fng:33行 shg:32行
If Cells(shg, i) = "S" Then
'下記の列は、タイトル行(FR-1)とデータ行(FR-LR)の最大幅でAutoFit
If i = 11 Then
Range("K" & FR - 1 & ":" & "K" & LR).Columns.AutoFit
Range("K" & fng) = "N" 'NでAutoFit済み
ElseIf i = 13 Then
Range("M" & FR - 1 & ":" & "M" & LR).Columns.AutoFit
Range("M" & fng) = "N"
ElseIf i = 17 Then
Range("Q" & FR - 1 & ":" & "Q" & LR).Columns.AutoFit
Range("Q" & fng) = "N"
ElseIf i = 19 Then
Range("S" & FR - 1 & ":" & "S" & LR).Columns.AutoFit
Range("S" & fng) = "N"
ElseIf i = 27 Then
Range("AA" & FR - 1 & ":" & "AA" & LR).Columns.AutoFit
Range("AA" & fng) = "N"
ElseIf i = 28 Then
Range("AB" & FR - 1 & ":" & "AB" & LR).Columns.AutoFit
Range("AB" & fng) = "N"
Else
Columns(i).AutoFit
End If
End If
Next i
No.2ベストアンサー
- 回答日時:
maamaaさん
プログラムは「コンパクト」に「わかりやすく」すれば、ミスも少なく、後で修正も楽になると思います。
◆プログラムサンプルは、以下2つ用意しました。
「列」を数字で判断した方が分かりやすいのか(Sub A)、「英字」(AH列とか)で判断した方がわかりやすいのか(Sub B)で選択
して下さい。
◆範囲の指定には「Cells」と「Range」がありますが、うまく使いこなして下さい。
確認テストはあまり行っていませんので、ミスがあるかも知れませんが、お試しください。
> 左の余白が有るのですが…
私もどういう方法が良いかは理解していませんが、私は半角スペース2つを全角スペースに置き換えています。
Sub A()
For I = 2 To 34
If Cells(shg, I) = "S" Then
Select Case I
Case 11, 13, 17, 19, 27, 28
Range(Cells(FR - 1, I), Cells(LR, I)).Columns.AutoFit
Cells(fng, I) = "N"
Case Else
Columns(I).AutoFit
End Select
End If
Next I
End Sub
Sub B()
For I = Columns("B").Column To Columns("AH").Column
If Cells(shg, I) = "S" Then
Select Case Split(Columns(I).Address(False, False), ":")(0)
Case "K", "M", "Q", "S", "AA", "AB"
Range(Cells(FR - 1, I), Cells(LR, I)).Columns.AutoFit
Cells(fng, I) = "N"
Case Else
Columns(I).AutoFit
End Select
End If
Next I
End Sub
こんばんは
夜中に親切に教えていただきまして大変ありがとうございます
仕事の関係で、最近は23時ごろからマクロをやっているので、夜中に教えていただける方は、私にとって
大変ありがたいです
Sub A()の部分で
Case 11, 13, 17, 19, 27, 28
Range(Cells(FR - 1, I), Cells(LR, I)).Columns.AutoFit
が大変勉強になりました
Case 11ということは、Iも11だから FR - 1, I と書けるということですね
それで
Case 11, 13, 17, 19, 27, 28 と、一気にコードが書けてしまう
と解釈しました
大変スマートな書き方で勉強になりました
Sub B()ですが
Select Case Split(Columns(I).Address(False, False), ":")(0) という ”おまじない” を書けば
Case "K", "M", "Q", "S", "AA", "AB" という表現が使えて便利です
Split(Columns(I).Address(False, False), ":")(0)は後で詳しく調べてみますが
いかにもプログラマー的な書き方ですね
"K", "M", "Q", "S", "AA", "AB" がわかりやすいので、おまじないがちょっとハードルが高いですが
Sub B()を真似して書いてみます
夜中に教えていただきましてありがとうございました
No.3
- 回答日時:
このケースだと、連想配列、マップと同じ扱いができるVBScript Dictionaryオブジェクトを使うのも手。
ふつうの配列を使うと格納した要素を一個ずつ変数と比較する手順を踏むプログラムコードを書くことになるが、単純に変数と一致するキーがあるかを調べるメソッドを呼び出すだけで済む。たとえば、以下。
キー、項目の組として、(11, "N"), (13, "N"), ..., (27, "N"), (28, "N")をディクショナリー・オブジェクト変数に格納。
ループ変数iをキーとして、ディクショナリー・オブジェクト内にキーが存在したら、項目を取り出して利用
Range(Cells(FR - 1, i), Cells(LR, i)).Columns.AutoFit
Cells(fng, i) = 項目
存在しなければ
Columns(i).AutoFit
と、IF文に関してはよりすっきり書ける。
こんばんは
夜中に親切に教えていただきまして大変ありがとうございます
何度か読んでいるうちに少しぼんやりとわかってきました
gooには本当に優秀な方が大勢いますね
時間はかかると思いますが、VBScript Dictionaryオブジェクト を調べてやってみます
ありがとうございました
No.1
- 回答日時:
よく見たわけではありませんが「Select Case」ステートメントを使えばもっとすっきりかけそうです。
もっと根本的なことですが
「Range("A" & 2)」は「Cells(2, 1)」のように列に文字を使わないで数値で指定できます。もちろん変数も使えます。
「Range("A" & 2 & ":" & "C" & 4)」も「Range(Cells(2, 1), Cells(4, 3))」のように指定できます。もちろん変数も使えます。
人の目には見難いですが、プログラムに数値だけですむので楽です。
こんな夜中に早速教えていただきありがとうございます
Select Caseをネットで調べたところ、確かに見た目がすっきりしそうですので勉強して使ってみます
ご指摘ありがとうございます
「Range(Cells(2, 1), Cells(4, 3))」「Cells(2, 1)」大変勉強になりました
早速直してみます
ありがとうございました
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) excel2021で実行できないマクロ。どこを直したらいいのか 2 2022/03/28 03:40
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Visual Basic(VBA) Excel VBAの解読について質問があります。 概要は、マクロでチェックボックスにチェックすると日 1 2023/02/10 07:50
- Visual Basic(VBA) [Excel VBA] このコードでは行の挿入や行の消去をすると13のエラーが出てしまう。 3 2022/12/09 00:29
- Visual Basic(VBA) オブジェクトが見つかりません 1 2023/06/24 19:43
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Excel(エクセル) R列の1111/11/11以外、且つQ列の×の条件で該当行のAからAE列までオレンジに塗りつぶす 2 2022/07/02 10:18
- Visual Basic(VBA) VBAで列を削除 3 2023/02/01 11:00
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
LEFT関数とIF関数の組み合わせ...
-
エクセルで離れた列を選択して...
-
エクセルで住所を県と市・郡と...
-
VBAで結合セルを転記する法を教...
-
「段」と「行」の違いがよくわ...
-
VLOOKUPの列番号の最大は?
-
CSVファイルの「0落ち」にVBA
-
エクセルで複数列の検索をマク...
-
VBAで別ブックの列を検索し、該...
-
えABのある列って
-
エクセルマクロPrivate Subを複...
-
Excel文字列一括変換
-
VBA 選択範囲とUnionの使い方に...
-
エクセルでセル12個間隔で合...
-
エクセルの列末のデータだけ表...
-
オートフィルターの複数抽出と...
-
データシートビューのタイトル...
-
エクセルのシートの大きさを変える
-
エクセルVBAでデータ最終行取得...
-
最終行に合計(最終行が列によ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで離れた列を選択して...
-
VLOOKUPの列番号の最大は?
-
「段」と「行」の違いがよくわ...
-
LEFT関数とIF関数の組み合わせ...
-
VBA 指定した列にある日時デー...
-
CSVファイルの「0落ち」にVBA
-
エクセルで複数列の検索をマク...
-
Excelの行数、列数を増やしたい...
-
エクセルマクロの組み方
-
エクセルマクロPrivate Subを複...
-
リストからデータを紐付けしたい
-
エクセルのソートで、数字より...
-
エクセルで住所を県と市・郡と...
-
VBAで別ブックの列を検索し、該...
-
VBA
-
Excel文字列一括変換
-
エクセル 重複 隣の列 一番...
-
列方向、行方向の定義
-
Alt+Shift+↑を一括で行うには、...
-
VBAで結合セルを転記する法を教...
おすすめ情報
お陰様でうまくできました。大変すっきりして見やすくなりました。
制限文字数の関係で一部だけ書きました。ありがとうございました
Select Case i 'by GooUserラックさん 2016/12/14
Case 11
'Range(Cells(2, 1), Cells(4, 3))
' 行,列 行,列
Range(Cells(FR - 1, 11), Cells(LR, 11)).Columns.AutoFit
Cells(fng, 11) = "N"
余白の件ですが、教えていただいたように全角スペースを使うとよいようです
お陰様で疑問が解けました
ありがとうございました