プロが教えるわが家の防犯対策術!

よろしくお願いします。いつも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

質問者からの補足コメント

  • HAPPY

    お陰様でうまくできました。大変すっきりして見やすくなりました。
    制限文字数の関係で一部だけ書きました。ありがとうございました
    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"

    No.1の回答に寄せられた補足コメントです。 補足日時:2016/12/14 01:23
  • HAPPY

    余白の件ですが、教えていただいたように全角スペースを使うとよいようです
    お陰様で疑問が解けました
    ありがとうございました

    No.2の回答に寄せられた補足コメントです。 補足日時:2016/12/14 03:02

A 回答 (3件)

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

こんばんは
夜中に親切に教えていただきまして大変ありがとうございます
仕事の関係で、最近は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()を真似して書いてみます

夜中に教えていただきましてありがとうございました

お礼日時:2016/12/14 02:46

このケースだと、連想配列、マップと同じ扱いができる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文に関してはよりすっきり書ける。
    • good
    • 0
この回答へのお礼

こんばんは
夜中に親切に教えていただきまして大変ありがとうございます

何度か読んでいるうちに少しぼんやりとわかってきました
gooには本当に優秀な方が大勢いますね

時間はかかると思いますが、VBScript Dictionaryオブジェクト を調べてやってみます
ありがとうございました

お礼日時:2016/12/14 02:58

よく見たわけではありませんが「Select Case」ステートメントを使えばもっとすっきりかけそうです。



もっと根本的なことですが
「Range("A" & 2)」は「Cells(2, 1)」のように列に文字を使わないで数値で指定できます。もちろん変数も使えます。
「Range("A" & 2 & ":" & "C" & 4)」も「Range(Cells(2, 1), Cells(4, 3))」のように指定できます。もちろん変数も使えます。
人の目には見難いですが、プログラムに数値だけですむので楽です。
この回答への補足あり
    • good
    • 0
この回答へのお礼

こんな夜中に早速教えていただきありがとうございます

Select Caseをネットで調べたところ、確かに見た目がすっきりしそうですので勉強して使ってみます
ご指摘ありがとうございます

「Range(Cells(2, 1), Cells(4, 3))」「Cells(2, 1)」大変勉強になりました
早速直してみます
ありがとうございました

お礼日時:2016/12/14 00:35

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