Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1714 / 13646 ツリー ←次へ | 前へ→

【72406】簡略化 ume 12/8/7(火) 18:29 質問[未読]
【72428】Re:簡略化 UO3 12/8/9(木) 10:03 発言[未読]
【72429】Re:簡略化 UO3 12/8/9(木) 10:07 発言[未読]

【72406】簡略化
質問  ume E-MAIL  - 12/8/7(火) 18:29 -

引用なし
パスワード
   よろしくお願いいたします

下記の記述を簡略化することはできますでしょうか
よろしくお願いいたします


Private Sub CommandButton1_Click()

 Sheet2.Range("A1:AG60").Value = Sheet15.Range("A1:AG60").Value
 Sheet2.Range("W5:AG5").Value = Format$(Now(), "ggge年mm月dd日(aaa)")


  Dim i As Long
  Dim lngRow As Long
  Dim lngColumn As Long
  Dim 行 As Long
  行 = ActiveCell.Row
 
  For i = 1 To 37 'チェックボックスの番号
    If Me.Controls("CheckBox" & i) Then
      lngColumn = (j Mod 4) * 8
      lngRow = (j \ 4) * 2
      ActiveSheet.Cells(行, 6 + i - 1).Copy _
          Sheet2.Cells(6 + lngRow, _
                 3 + lngColumn).Resize(2, 7)
          
      j = j + 1
    End If
  Next i
   
 Sheet2.Range("Y25:AG26") = ComboBox1.Text '送信者
 Sheet2.Range("L32:AG36") = "仮設トイレ、水道、電気" '用件
 Cells(行, "B").Copy Sheet2.Range("L39:R41") '工事名
 Cells(行, "D").Copy Sheet2.Range("AA39:AG41") '監督名
 Cells(行, "C").Copy Sheet2.Range("L44:AG46") '工事場所
 Sheet2.Range("A48:K56") = "希望設置日" '希望設置日
 Sheet2.Range("L51:AG53").Value = Format(Calendar1.Value, "ggge年mm月dd日(aaa)") 'カレンダーから摘出
 Sheet2.Range("L57:AG60") = TextBox1.Text '備考
  
 Dim myMSG As String
  Dim myFlg As Boolean
  Dim x As Long
 
  myFlg = False
  For x = 1 To 37 'チェックボックスの番号
    If Me.Controls("CheckBox" & x).Value = True Then
      myMSG = myMSG & Me.Controls("CheckBox" & x).Caption & vbCrLf
      myFlg = True
    End If
  Next x
 
  If myFlg = True Then
    myMSG = myMSG & "宛てで宜しいですか?"
    If MsgBox(myMSG, vbInformation + vbYesNo) = vbYes Then
    Sheet2.Activate
    Me.Hide
    ActiveWindow.ActiveSheet.PrintPreview
    Me.Show vbModeless
    End If
  Else
    myMSG = "いずれにもチェックが入っていません"
    MsgBox myMSG
  End If
 
End Sub

【72428】Re:簡略化
発言  UO3  - 12/8/9(木) 10:03 -

引用なし
パスワード
   ▼ume さん:

(友人のPCからPCで投稿し、HNをそのままにしていましたので削除して再投稿します)

おはようございます

簡略化ということでいえば、チェックボックスの値の判定による転記も、
上手にループ処理しておられますので特に、申し上げることはないのではと思います。

簡略化ではなく、コードの記述方式ということで申し上げれば、これは、その人、それぞれ
様々な書き方があるわけですが、

・まず、必要な変数を記述しておられるのはとてもよいことですね。
 ただ、すべてを記述しましょう。 アップされたコードでは j の記述がないですね。
 これでも、問題なく動いているということは、モジュールの先頭に Option Explict の記述が
 ないということですね。VBE画面のツール->オプションの編集タブで、変数の宣言を必須 に
 チェックをいれておかれることを強く、おすすめします。
・で、その変数宣言の場所ですが、アップされたコードのように、実行コード内で
 それが使われる直前に、記述しても、もちろん問題ないのですが、わかりやすさという観点では
 プロシジャの先頭にまとめて記述するのがよろしいように思います。
 記述をすればメモリーが確保される、そうすると処理効率に影響を与える、だから、ぎりぎりまで
 宣言せず、それにいたる処理効率を少しでもアップすべきだという見解もあるかもしれませんが
 昨今のPCのメモリー状況を考えますと、先頭でまとめて記述しても全く問題ないと思いますね。
・シートオブジェクトを、 Sheet2 とか Sheet15 という 「コードネーム」で指定しておられますね。
 もちろん、「シートはコードネームで指定すべき」とおっしゃるエキスパートさんもおられます。
 ただ、コードネームは、ブックを作成したり、あとでシートを追加したりしたときに自動採番される
 順番で、Sheet1,Sheet2,Sheet3 と設定されます。生まれたときにつけられる本名のようなものです。
 その後、Sheet1をブックの最後に移動したとしても、Sheet1はSheet1のままです。
 また、Sheet15 まで存在するブックのSheet3を削除し、その場所に新規シートを挿入すると
 このシートのコードネームはSheet16 になります。
 これにたいして「シート名」がありますね。シートタブに表示されている名前です。
 Sheet1にたいして、"一覧表"という名前をつけることがありますね。このシートは
 このシートがブック内のどこに移動しようとSheets("一覧表")として参照できます。
 あとからブックを見たときに、「ブックを作った時点で一番左にあったはずのシート」というより
 "一覧表"というシート名をもったシート というほうが、よりわかりやすくありませんか?
・あとは、そうですね、Sheet2.Range(・・・ といった記述が多く登場しますね。
 もちろん、問題はありませんが、これを
 With Sheet2
  .Range(・・・
  .Range(・・・
 End With
 こう書きますと、コード数は2行増えますが、各コードは、少しスリムになりますね。

【72429】Re:簡略化
発言  UO3  - 12/8/9(木) 10:07 -

引用なし
パスワード
   ▼ume さん:

補足します

シート名を変更せず、たとえば"Sheet1"のままでも、Sheets("Sheet1") として
「シート名」で参照できます。これはコードネームとしてのSheet1のことでは
ありません。

1714 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free