Excel VBA質問箱 IV

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

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


7012 / 13644 ツリー ←次へ | 前へ→

【41755】引数を使いコードをまとめたい yusuke 06/8/22(火) 1:55 質問[未読]
【41756】Re:引数を使いコードをまとめたい Blue 06/8/22(火) 2:16 発言[未読]
【41757】Re:引数を使いコードをまとめたい Kein 06/8/22(火) 2:48 回答[未読]
【41762】Re:引数を使いコードをまとめたい yusuke 06/8/22(火) 9:44 発言[未読]
【41763】Re:引数を使いコードをまとめたい ponpon 06/8/22(火) 10:56 発言[未読]
【41764】Re:引数を使いコードをまとめたい yusuke 06/8/22(火) 11:42 発言[未読]
【41765】Re:引数を使いコードをまとめたい ponpon 06/8/22(火) 12:02 発言[未読]
【41770】Re:引数を使いコードをまとめたい yusuke 06/8/22(火) 13:27 発言[未読]
【41778】Re:引数を使いコードをまとめたい Kein 06/8/22(火) 16:22 発言[未読]
【41786】Re:引数を使いコードをまとめたい yusuke 06/8/22(火) 19:05 お礼[未読]

【41755】引数を使いコードをまとめたい
質問  yusuke  - 06/8/22(火) 1:55 -

引用なし
パスワード
   知恵を貸してください。
標準モジュールに下記データが書き込まれているのですが
コードを引数を使いコンパクトにまとめる方法をご教授下さい。
よろしくお願いします。

Sub Main()
  Dim Rtn As String
  Dim X As Long

  Rtn = InputBox("1から80のいずれかを入力してください")
  X = Val(Rtn)
  Select Case X
    Case 1
      Call Code01
    Case 2
      Call Code02
    Case 3
      Call Code03
    Case 4
      Call Code04
     ・
     ・
     ・
    Case 80
      Call Code80
  End Select
End Sub
---------------------------------------------------------------------------
Sub Code01()
  Dim rc As Long
  rc = MsgBox(Sheets("入力").Range("B8").Value & "の契約書作成します。", vbYesNo)
If rc = vbYes Then
  rc = MsgBox("内訳は、" & Sheets("入力").Range("J8").Value & "です。", vbYesNo)
If rc = vbYes Then
  Sheets("入力").Select
  Range("A8:BC8").Select
  Selection.Copy
  Sheets("契約書作成").Select
  Range("AN3").Select
  ActiveSheet.Paste
  Sheets("入力").Select
  Application.CutCopyMode = False
  Range("A7").Select
  Sheets("契約書作成").Select
  With Selection.Interior
    Range("AM3:DA3").Select
    .ColorIndex = 10
    .Pattern = xlSolid
    .PatternColorIndex = xlAutomatic
  End With
  Application.Goto Reference:="R1C1"
End If
End If
End Sub

Sub Code02()
  Dim rc As Long
  rc = MsgBox(Sheets("入力").Range("B9").Value & "の契約書作成します。", vbYesNo)
If rc = vbYes Then
  rc = MsgBox("内訳は、" & Sheets("入力").Range("J9").Value & "です。", vbYesNo)
If rc = vbYes Then
  Sheets("入力").Select
  ActiveWindow.SmallScroll ToRight:=-7
  Range("A9:BC9").Select
  Selection.Copy
  Sheets("契約書作成").Select
  Range("AN3").Select
  ActiveSheet.Paste
  Sheets("入力").Select
  Application.CutCopyMode = False
  Range("A7").Select
  Sheets("契約書作成").Select
    Range("AM3:DA3").Select
  With Selection.Interior
    .ColorIndex = 10
    .Pattern = xlSolid
    .PatternColorIndex = xlAutomatic
  End With
  Application.Goto Reference:="R1C1"
End If
End If
End Sub

Sub Code03()
  Dim rc As Long
  rc = MsgBox(Sheets("入力").Range("B10").Value & "の契約書作成します。", vbYesNo)
If rc = vbYes Then
  rc = MsgBox("内訳は、" & Sheets("入力").Range("J10").Value & "です。", vbYesNo)
If rc = vbYes Then
  Sheets("入力").Select
  ActiveWindow.SmallScroll ToRight:=-7
  Range("A10:BC10").Select
  Selection.Copy
  Sheets("契約書作成").Select
  Range("AN3").Select
  ActiveSheet.Paste
  Sheets("入力").Select
  Application.CutCopyMode = False
  Range("A7").Select
  Sheets("契約書作成").Select
    Range("AM3:DA3").Select
  With Selection.Interior
    .ColorIndex = 10
    .Pattern = xlSolid
    .PatternColorIndex = xlAutomatic
  End With
  Application.Goto Reference:="R1C1"
End If
End If
End Sub
   ・
   ・
   ・
Sub Code80()
  Dim rc As Long
  rc = MsgBox(Sheets("入力").Range("B87").Value & "の契約書作成します。", vbYesNo)
If rc = vbYes Then
  rc = MsgBox("内訳は、" & Sheets("入力").Range("J87").Value & "です。", vbYesNo)
If rc = vbYes Then
  Sheets("入力").Select
  ActiveWindow.SmallScroll ToRight:=-7
  Range("A87:BC87").Select
  Selection.Copy
  Sheets("契約書作成").Select
  Range("AN3").Select
  ActiveSheet.Paste
  Sheets("入力").Select
  Application.CutCopyMode = False
  Range("A7").Select
  Sheets("契約書作成").Select
    Range("AM3:DA3").Select
  With Selection.Interior
    .ColorIndex = 10
    .Pattern = xlSolid
    .PatternColorIndex = xlAutomatic
  End With
  Application.Goto Reference:="R1C1"
End If
End If
End Sub

【41756】Re:引数を使いコードをまとめたい
発言  Blue  - 06/8/22(火) 2:16 -

引用なし
パスワード
   Code01とCode02はなにが違うのか、どのような法則があるのかを考えてみてください。

01 のとき B8, J8, A8:BC8, AN3, A7, AM3:DA3 --> "B" & 7 + 1, "J" & 7 + 1, "A" & ( 7 + 1 ) & "BC" & ( 7 + 1 )
02 のとき B9, J9, A9:BC9, AN3, A7, AM3:DA3 --> "B" & 7 + 2, "J" & 7 + 2, "A" & ( 7 + 2 ) & "BC" & ( 7 + 2 )



80 のとき


というのを考えて、数学の数列のように CodeN を N を使って記述してみてください。
まずはここまで。

【41757】Re:引数を使いコードをまとめたい
回答  Kein  - 06/8/22(火) 2:48 -

引用なし
パスワード
   Sub Main()
  Dim Num As Long, X As Long
  Const Pmt As String = _
  "1から80のいずれかの数値を入力してください"
 
  Do
   Num = Application.InputBox(Pmt, Type:=1)
   If Num = False Then Exit Sub
  Loop While Num < 1 Or Num > 80
  X = Num + 7
  Call MyCode(X)
End Sub

Sub MyCode(X As Variant)
  Dim SetR As Long, Ans As Long
  Dim GetV As Variant, GetV2 As Variant
  Dim Sh As Worksheet

  If IsMissing(X) Then
   MsgBox "先にMainプロシージャを実行して下さい", 48
   Exit Sub
  End If
  SetR = CLng(X): Set Sh = Worksheets("契約書作成")
  With Worksheets("入力")
   GetV1 = .Cells(SetR, 2).Value
   GetV2 = .Cells(SetR, 10).Value
   Ans = MsgBox(GetV1 & " の契約書を作成しますか" & _
   vbLf & "内訳は " & GetV2 & " です", 36)
   If Ans = 7 Then GoTo ELine
   .Range(.Cells(SetR, 1), .Cells(SetR, 55)).Copy
  End With
  Sh.Range("AN3").PasteSpecial
  With Sh.Range("AM3:DA3").Interior
   .ColorIndex = 10
   .Pattern = xlSolid
  End With
  With Application
   .CutCopyMode = False
   .GoTo Sh.Range("A1"), True
  End With
ELine:
  Set Sh = Nothing
End Sub

で、よいでしょう。

【41762】Re:引数を使いコードをまとめたい
発言  yusuke  - 06/8/22(火) 9:44 -

引用なし
パスワード
   keinさん・Blueさん返事ありがとうございます。お世話になります。

keinさんウヒョー(?_?)です。あんな長いコードがこんなに・・・・・
シコシココピーして書き込んだ私がバカみたいです。
コードは意味はあまりよく分かりませんが確実に実行できています。
この上に誠に申し訳ないのですが構文の意味を少し書き込んで
頂けないでしょうか?暇なときで結構ですので、
全部理解したいのですが少しずつ意味を理解していきたいので
特に48とか36とか55の数字は何を意味してるのでしょう?
よろしくお願いします。m(_ _)m

Blueさんhintありがとうございます。
"B" & 7 + n, "J" & 7 + n, "A" & ( 7 + n ) & "BC" & ( 7 + n )
↑こういう事でしょうか?
規則的に1つずつ増えています。・・・

【41763】Re:引数を使いコードをまとめたい
発言  ponpon  - 06/8/22(火) 10:56 -

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

>特に48とか36とか55の数字は何を意味してるのでしょう?
ここのとこだけ。
Msgboxをヘルプで調べましょう。
定数    値    内容
vbOKOnly    0    (既定値) [OK] ボタンのみを表示します。
vbOKCancel    1    [OK] ボタンと [キャンセル] ボタンを表示します。
vbAbortRetryIgnore    2    [中止]、[再試行]、[無視] の 3 つのボタンを表示します。
vbYesNoCancel    3    [はい]、[いいえ]、[キャンセル] の 3 つのボタンを表示します。
vbYesNo         4    [はい] ボタンと [いいえ] ボタンを表示します。
vbRetryCancel    5    [再試行] ボタンと [キャンセル] ボタンを表示します。
vbCritical    16    警告メッセージ アイコンを表示します。
vbQuestion    32    問い合わせメッセージ アイコンを表示します。
vbExclamation    48    注意メッセージ アイコンを表示します。
vbInformation    64    情報メッセージ アイコンを表示します。
vbDefaultButton1    0    (既定値)第 1 ボタンを標準ボタンに設定します。
vbDefaultButton2    256    第 2 ボタンを標準ボタンに設定します。
vbDefaultButton3    512    第 3 ボタンを標準ボタンに設定します。
vbDefaultButton4    768    第 4 ボタンを標準ボタンに設定します。
vbApplicationModa     0    (既定値)アプリケーション モーダルに設定します。
vbSystemModal    4096    システム モーダルに設定します。
vbMsgBoxHelpButton    16384    ヘルプ ボタンを追加します。
VbMsgBoxSetForeground    65536    最前面のウィンドウとして表示します。
vbMsgBoxRight    524288    テキストを右寄せで表示します。
vbMsgBoxRtlReading    1048576    テキストを、右から左の方向で表示します。

MsgBox 関数の戻り値        

定数    値    内容 (選択されたボタン)
vbOK    1    [OK]
vbCancel    2    [キャンセル]
vbAbort    3    [中止]
vbRetry    4    [再試行]
vbIgnore    5    [無視]
vbYes    6    [はい]
vbNo    7    [いいえ]

となっています。
したがって、48=注意メッセージ アイコンを表示します。
36=32+4=問い合わせメッセージ アイコンを表示します。+[はい] ボタンと [いいえ] ボタンを表示します。
となります。
合わせて、If Ans = 7の7は、vbNo 7 [いいえ]ということです。

55については、BC列が55列目になるということです。
ツール→オプション→全般→R1C1参照形式を使用するにチェックを入れると
BC列が55と表示されます。

【41764】Re:引数を使いコードをまとめたい
発言  yusuke  - 06/8/22(火) 11:42 -

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

>>特に48とか36とか55の数字は何を意味してるのでしょう?
>ここのとこだけ。
>Msgboxをヘルプで調べましょう。
>定数    値    内容
>vbOKOnly    0    (既定値) [OK] ボタンのみを表示します。
>vbOKCancel    1    [OK] ボタンと [キャンセル] ボタンを表示します。
>vbAbortRetryIgnore    2    [中止]、[再試行]、[無視] の 3 つのボタンを表示します。
>vbYesNoCancel    3    [はい]、[いいえ]、[キャンセル] の 3 つのボタンを表示します。
>vbYesNo         4    [はい] ボタンと [いいえ] ボタンを表示します。
>vbRetryCancel    5    [再試行] ボタンと [キャンセル] ボタンを表示します。
>vbCritical    16    警告メッセージ アイコンを表示します。
>vbQuestion    32    問い合わせメッセージ アイコンを表示します。
>vbExclamation    48    注意メッセージ アイコンを表示します。
>vbInformation    64    情報メッセージ アイコンを表示します。
>vbDefaultButton1    0    (既定値)第 1 ボタンを標準ボタンに設定します。
>vbDefaultButton2    256    第 2 ボタンを標準ボタンに設定します。
>vbDefaultButton3    512    第 3 ボタンを標準ボタンに設定します。
>vbDefaultButton4    768    第 4 ボタンを標準ボタンに設定します。
>vbApplicationModa     0    (既定値)アプリケーション モーダルに設定します。
>vbSystemModal    4096    システム モーダルに設定します。
>vbMsgBoxHelpButton    16384    ヘルプ ボタンを追加します。
>VbMsgBoxSetForeground    65536    最前面のウィンドウとして表示します。
>vbMsgBoxRight    524288    テキストを右寄せで表示します。
>vbMsgBoxRtlReading    1048576    テキストを、右から左の方向で表示します。
>
>MsgBox 関数の戻り値        
>
>定数    値    内容 (選択されたボタン)
>vbOK    1    [OK]
>vbCancel    2    [キャンセル]
>vbAbort    3    [中止]
>vbRetry    4    [再試行]
>vbIgnore    5    [無視]
>vbYes    6    [はい]
>vbNo    7    [いいえ]

ヘルプに書いてありました。

>となっています。
>したがって、48=注意メッセージ アイコンを表示します。
>36=32+4=問い合わせメッセージ アイコンを表示します。+[はい] ボタンと [いいえ] ボタンを表示します。
>となります。
>合わせて、If Ans = 7の7は、vbNo 7 [いいえ]ということです。
>
>55については、BC列が55列目になるということです。
>ツール→オプション→全般→R1C1参照形式を使用するにチェックを入れると
>BC列が55と表示されます。
ponponさん詳しい説明ありがとうございます。
難しそうですがこれから少しずつお勉強したいと思います。
それと下記構文もよくわからないのですが、Do Loop Const While ELine etc?
何度も不躾な質問ですみません
  Dim Num As Long, X As Long
  Const Pmt As String = _
  "1から80のいずれかの数値を入力してください"
  Do
   Num = Application.InputBox(Pmt, Type:=1)
   If Num = False Then Exit Sub
  Loop While Num < 1 Or Num > 80
  X = Num + 7
  Call MyCode(X)

If Ans = 7 Then GoTo ELine
          ~~~~~~~~
よろしくお願いします。
わががまな事を申し上げ恐縮です。(VBA不慣れなもので・・・)m(_ _)m

【41765】Re:引数を使いコードをまとめたい
発言  ponpon  - 06/8/22(火) 12:02 -

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

>何度も不躾な質問ですみません
>  Dim Num As Long, X As Long
>  Const Pmt As String = _
>  "1から80のいずれかの数値を入力してください"
>  Do
>   Num = Application.InputBox(Pmt, Type:=1)
    'インプットボックスに数字を、その答えをNumに格納  
>   If Num = False Then Exit Sub
    'Numが空だったら抜ける
>  Loop While Num < 1 Or Num > 80
   'Numが1より小さい80より大きい場合は、インプットボックスを表示
   'つまり、Numが1から80なるまでインプットボックスを表示
>  X = Num + 7
>  Call MyCode(X)
>
>If Ans = 7 Then GoTo ELine
>          ~~~~~~~~
  'ansが7つまりvbNOならELineに跳びなさい。
  'コードの下の方にELineがあると思います。

【41770】Re:引数を使いコードをまとめたい
発言  yusuke  - 06/8/22(火) 13:27 -

引用なし
パスワード
   ponponさんありがとうございます。
ちょっとわかったような?
いろいろ面倒をおかけしました。
早く構文の意味ぐらい分かるようになりたいと思います。

【41778】Re:引数を使いコードをまとめたい
発言  Kein  - 06/8/22(火) 16:22 -

引用なし
パスワード
   遅くなりましたがponponさん、フォローありがとうございます。
詳しく解説してくださっているようなので、それで意味は理解できる
と思いますが、まだ何かあったら書いて下さい。
それから、一ヶ所訂正があります。
>Dim GetV As Variant


Dim GetV1 As Variant

"1"が抜けてました。すいません。

【41786】Re:引数を使いコードをまとめたい
お礼  yusuke  - 06/8/22(火) 19:05 -

引用なし
パスワード
   ▼Kein さん:
>遅くなりましたがponponさん、フォローありがとうございます。
>詳しく解説してくださっているようなので、それで意味は理解できる
>と思いますが、まだ何かあったら書いて下さい。
>それから、一ヶ所訂正があります。
>>Dim GetV As Variant
>↓
>
>Dim GetV1 As Variant
>
>"1"が抜けてました。すいません。
細かな気配りありがとうございます。
またなんか解らないときには、お力貸してください。
失礼します。

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