Excel VBA質問箱 IV

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

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


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

【46840】データがある場合クリア タッキー 07/2/18(日) 16:33 質問[未読]
【46841】Re:データがある場合クリア りん 07/2/18(日) 17:34 発言[未読]
【46842】Re:データがある場合クリア Kein 07/2/18(日) 17:37 回答[未読]
【46852】Re:データがある場合クリア タッキー 07/2/19(月) 1:02 お礼[未読]

【46840】データがある場合クリア
質問  タッキー  - 07/2/18(日) 16:33 -

引用なし
パスワード
   vbaは初心者です
以前教えていただいたコードに追加したいのですが
教えて下さい。"AN3:BM3"にデータがある場合は
下記のコード[クリアー]を実行してからMainRを実行というコードを
組み込みたいのですよろしくお願いします。
また作業完了時コード中★★の部分に
同じように警告を出したいと考えてます。IF Thenの書き方が
いまいちよくわかりませんので教えて頂き今後の参考に出来ればと
思っています。単純な質問だと思いますが悩んでます。
お解りの方 恐縮ですがお願いします。

Sub クリアー()
  Sheets("注文書作成").Select
  ActiveSheet.Unprotect
  Range("AN3:BM3").Select
  Selection.ClearContents
End Sub

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

  Rtn = InputBox("発注業者1から100のいずれかを入力してください")
  X = Val(Rtn)
  Call Code(X + 7)
End Sub

Sub Code(i As Long)
  Dim rc As Long
  rc = MsgBox(Sheets("発注先").Range("B" & i).Value & _
  "、の注文書を作成します。 ", vbYesNo, Title:="発注先は・・・")
If rc = vbNo Then
Else
Application.Goto Reference:="R1C1"
  rc = MsgBox("工種項目は、" & Sheets("発注先").Range("J" & i).Value & _
  "です。 ", vbYesNo, Title:="発注内容です。")
If rc = vbYes Then
  ActiveSheet.Unprotect
  Sheets("発注先").Select
  Range("A" & i & ":Y" & i).Select
 
  Selection.Copy
  Sheets("注文書作成").Select
  Range("AN3").Select
  Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
  Application.CutCopyMode = False
  Sheets("発注先").Select
  Application.CutCopyMode = False
  Range("A7").Select
  Sheets("注文書作成").Select
    Range("AN3:BL3").Select
  With Selection.Interior
    .ColorIndex = 11
    .Pattern = xlSolid
    .PatternColorIndex = xlAutomatic
  End With
  Application.Goto Reference:="R1C1"
Dim Prompt As kt_MsgBoxPromptType

★★ここへ"AO3,AR3,AW3,BL3"にデータがない場合
 MsgBox "データがありません"と表示し
データががある場合は↓を表示させたい。
ktMsgBoxは気にしないで下さい普通に[MsgBox]と考えて頂いてOKです。

Call ktMsgBoxPromptTypeInit(Prompt)
With Prompt
 .Message(1) = "※発注書作成しました。" & vbCrLf & _
 "その他未記入箇所を入力して完成させなさい。" & vbCrLf & ""
 .FName(1) = "MS UI Gothic"
 .FSize(1) = 14
 .FBold(1) = True
 .FColor(1) = -1
End With
rc = ktMsgBoxEX(Prompt _
        , vbOKOnly + vbCritical, "警告!" _
        , BackColor:=&HCCFFCC)
End If
End If
  ActiveSheet.Protect DrawingObjects:=True, _
  Contents:=True, Scenarios:=True
  ActiveSheet.EnableSelection = xlUnlockedCells
End Sub

【46841】Re:データがある場合クリア
発言  りん E-MAIL  - 07/2/18(日) 17:34 -

引用なし
パスワード
   タッキー さん、こんにちわ。

>★★ここへ"AO3,AR3,AW3,BL3"にデータがない場合
> MsgBox "データがありません"と表示し

たとえばこんな分岐(COUNTAワークシート関数を使用)
If Application.WorksheetFunction.CountA(Range("AO3,AR3,AW3,BL3")) = 0 Then
  MsgBox "ないよ", vbInformation
Else
  MsgBox "あるよ", vbInformation
End If

【46842】Re:データがある場合クリア
回答  Kein  - 07/2/18(日) 17:37 -

引用なし
パスワード
   >"AN3:BM3"にデータがある場合は
えっと・・それは簡単に言うと「人間中心の発想」なんですね。
「データがあるかないかを調べてから、あればクリアする・・」
は、裏を返すと
「何かの処理をする前に、指定したセル範囲が必ず空白になっている必要がある」
ということだから、データがあろうと無かろうとクリアしてしまう。ということで
良いのです。マクロの処理はアッという間なので、それでも問題にならないのです。
で、提示されているコードを見て感じるのは「一つにまとめられるプローシージャ
を、意味もなく分割している」ということです。実はプロシージャの分割を効果的に
行えるようになるには、かなりの経験が必要なのです。その"勘どころ"が掴めない
うちは、やたらと分割しない方が処理速度の低下を少なくするメリットが大きい、
と思って下さい。
で、いろいろ能書きをたれるのは私の性分ではないので、いつものようにサンプル
コードを提示します。全体を効率よく処理できるように編集すると、このように
なるだろうと思われるコードです。

Sub Main()
  Dim Prompt As kt_MsgBoxPromptType
  Dim Cnt As Long
  Dim MyV1 As String, MyV2 As String
  Dim GetV As Variant
  Const Pmt1 As String = _
  "発注業者1から100のいずれかを入力してください"
  Const Pmt2 As String = "、の注文書を作成しますか。 "
  Const Pmt3 As String = "工種項目は、"
  Const Pmt4 As String = "でよろしいですか"
  Const Pmt5 As String = "データがありません !"

  Do
   Cnt = Application.InputBox(Pmt1, Type:=1)
   If Cnt = False Then Exit Sub
  Loop While Cnt < 1 Or Cnt > 100
  Cnt = Cnt + 7
  With Sheets("発注先")
   MyV1 = .Range("B" & Cnt).Value
   MyV2 = .Range("J" & Cnt).Value
   GetV = .Range("A" & Cnt).Resize(, 25).Value
  End With
  If MsgBox(MyV1 & Pmt2, 36, "発注先は・・・") = 7 Then Exit Sub
  If MsgBox(Pmt3 & MyV2 & Pmt4, 36, "発注内容です。") = 7 Then Exit Sub
  With Sheets("注文書作成")
   .Unprotect
   .Range("AN3:BM3").ClearContents
   .Range("AN3").Resize(, 25).Value = GetV
   .Range("AN3:BL3").Interior.ColorIndex = 11
   .Activate
   .Protect
   .EnableSelection = xlUnlockedCells
   If WorksheetFunction _
   .CountA(.Range("AO3, AR3, AW3, BL3")) < 4 Then
     MsgBox Pmt5, 48: Exit Sub
   End If
  End With
  '以下はそちらで適当に記述すること
  'Call ktMsgBoxPromptTypeInit(Prompt)
End Sub

【46852】Re:データがある場合クリア
お礼  タッキー  - 07/2/19(月) 1:02 -

引用なし
パスワード
   ▼Kein さん:
>>"AN3:BM3"にデータがある場合は
>えっと・・それは簡単に言うと「人間中心の発想」なんですね。
>「データがあるかないかを調べてから、あればクリアする・・」
>は、裏を返すと
>「何かの処理をする前に、指定したセル範囲が必ず空白になっている必要がある」
>ということだから、データがあろうと無かろうとクリアしてしまう。ということで
>良いのです。マクロの処理はアッという間なので、それでも問題にならないのです。
>で、提示されているコードを見て感じるのは「一つにまとめられるプローシージャ
>を、意味もなく分割している」ということです。

>実はプロシージャの分割を効果的に
>行えるようになるには、かなりの経験が必要なのです。その"勘どころ"が掴めない
>うちは、やたらと分割しない方が処理速度の低下を少なくするメリットが大きい、
>と思って下さい。
Keinさん
ありがとうございました。
勘所ですか、なるほど
まだまだ読み取るのが厳しい状況でそこまでとてもとてもです。
またお聞きするかもしれません。その節はよろしくお願いします。

りんさん
分岐方法の指導ありがとうございました。
またお願いします。
解決!

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