[[20151007035910]] 『保存前に入力確認するには』(take) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『保存前に入力確認するには』(take)

web上で確認しましたが、あまりヒットしなかったので質問いたします。
いくつかのセルの入力を確認した上で以下の「セル名保存」を実行させたい。
概要
確認するセル V7(コード) AE7(番号) C19(取引先名) A34(送り先) AJ15(住所)
以上5セルの入力(後々セル数は増える可能性あり)を確認した後、保存

IF 5つのセル入力確認 (本来入力内容チェックもすべきですが割愛)
5つ全て入力が完了なら
Call セル名保存
未入力があるなら
MsgBox たとえば2つあるなら 「C19(取引先),AJ15(住所)」が未入力です。を表示

この条件のマクロの記述方法を教授ください。
よろしくお願いします。

Sub セル名保存()

    Dim Wb As Excel.Workbook
    Dim Sht As Excel.Worksheet
    Dim DirPath As String
    Dim FileName As String
    Dim FilePath As String
    Dim n As String
    Range("A6").Select
    Set Wb = Excel.ActiveWorkbook
    If Wb Is Nothing Then Exit Sub
    On Error GoTo ErrHdl
    Set Sht = Wb.Worksheets.Item("表紙")
    n = "100V"  'バージョン
    DirPath = "\\NSR_SERIES\share\soumu\"
    With Sht
        FileName = FileName & Format$(Date, "yyyymmdd") & "_02" _
                 & .Range("V7").Value & "-" _
                 & .Range("AE7").Value & "_" _
                 & .Range("C19").Value
    End With
   :
   :
End Sub

< 使用 Excel:Excel2013、使用 OS:Windows7 >


 >C19(取引先),AJ15(住所)

 このようにメッセージ表示させたいなら、例にあげられたセルには、名前の定義で名前を命名しておくと便利です。

 セルに名前を付けるのは、手動操作でもちろん可能ですが、

 Sub 名前の定義()
        With ActiveSheet
           .Range("v7").Name = "コード"
           .Range("ae7").Name = "番号"
           .Range("c19").Name = "取引先名"
           .Range("a34").Name = "送り先"
           .Range("aj15").Name = "住所"
        End With
 End Sub

 上記のようなコードで V7には、コードという命名がされます。

 未入力チェックは、

 Sub chk_rng()
    Dim msg() As String
    Dim cnt As Long
    Dim rng As Range
    For Each rng In ActiveSheet.Range("v7,ae7,c19,a34,aj15")
       If rng.Value = "" Then
          ReDim Preserve msg(1 To cnt + 1)
          msg(cnt + 1) = rng.Address(False, False) & "(" & rng.Name.Name & ")"
          cnt = cnt + 1
       End If
    Next
    If cnt > 0 Then
       MsgBox Join(msg, "、") & vbCrLf & "が未入力です"
    End If

 End Sub

 このように 正に 未入力か否かで確認すればよいですね!!

 >後々セル数は増える可能性あり

 こういう拡張性を予想すること大事ですね!!

 このセル数が増える可能性は どのくらいでしょう?

 増えても数個なら、上記の例に倣えば可能ですが、数百個になることも考えられるなら、
 もう少し考えなければならないかもしれません。

 検討してみてください

 >On Error GoTo ErrHdl
 これは、どのエラーが気になるから付けているのですか?

( ichinose) 2015/10/07(水) 05:44


ichinoseさん
返答ありがとうございます。
実行してみましたが、★部分でエラー「アプリケーション定義またはオブジェクト定義エラーです」と
出てしまいます。
未熟ですみませんが対応お願いします。
 Sub chk_rng()
    Dim msg() As String
    Dim cnt As Long
    Dim rng As Range
    For Each rng In ActiveSheet.Range("v7,ae7,c19,a34,aj15")
       If rng.Value = "" Then
          ReDim Preserve msg(1 To cnt + 1)
          msg(cnt + 1) = rng.Address(False, False) & "(" & rng.Name.Name & ")"’★
          cnt = cnt + 1
       End If
    Next
    If cnt > 0 Then
       MsgBox Join(msg, "、") & vbCrLf & "が未入力です"
    End If

 End Sub
>※このセル数が増える可能性は どのくらいでしょう?
増えても10数個です。
また セル名保存のマクロを今回提示の何処に挿入すればいいのでしょうか? 
Call セル名保存

よろしくお願いします。

(take) 2015/10/07(水) 11:20


 >実行してみましたが、★部分でエラー「アプリケーション定義またはオブジェクト定義エラーです」と 
 >出てしまいます。 
 それは名前の定義がされていないか、

 >ActiveSheet.Range("v7,ae7,c19,a34,aj15")
 この部分で、名前の定義がされたセルを指定していないからでしょう。

 名前の定義がされているか
 名前の定義がされたセルをRangeで指定しているか
 この二つを確認してみてください。
(稲葉) 2015/10/07(水) 11:30

稲葉さん
ありがとうございます。
名前の定義ですか?
 Sub 名前の定義()
        With ActiveSheet
           .Range("v7").Name = "コード"
           .Range("ae7").Name = "番号"
           .Range("c19").Name = "取引先名"
           .Range("a34").Name = "送り先"
           .Range("aj15").Name = "住所"
        End With
 End Sub
上記を指定ということでしょうか?
ちょっと指定する方法が解りません
Dim rng As Range
(take) 2015/10/07(水) 11:59

 「名前の定義」は エクセルの一般機能の名称で、ichinoseさんが付けたコードの名前を指している
 わけでは有りません。
 おそらくここを誤解されているのだとは思います。

 ichinoseさんも
 > セルに名前を付けるのは、手動操作でもちろん可能ですが、
 このように前置きされておりますように、手動の手順が解説されたサイトがいくつかあります。

http://www.tipsfound.com/Excel2013/01406.vbhtml

 名前の定義 2013
 で検索した結果です。

 手動で名前を付けた場合も、VBAの中で利用することが可能です。
 ↑で紹介した手順に従い、G1セルを一つ選択し、「テスト」という名称で名前をつけてください。

 次に下のコードを実行して、先ほど名前をつけたセルのアドレスが表示されることを確認してください。

    Sub 名前をつけたセルアドレスの取得()
        MsgBox Range("テスト").Address(False, False) 'G1 と表示される
    End Sub

 次に下のコードを実行して、先ほどのセルを指定すると、セルにつけた名前が表示されることを確認してください。

    Sub アドレスから名前を取得()
        MsgBox ActiveSheet.Range("G1").Name.Name 'テスト と表示される
    End Sub

 最後に下のコードを実行して、エラーになることを確認してください。

    Sub エラーの原因は指定したセルに名前がないから()
        MsgBox ActiveSheet.Range("G" & Rows.Count).Name.Name 'エラーになる
    End Sub

 これがエラーになる原因です。

 名前を手動で定義する方法と
 エラーになる原因を説明しました。

 まずはエラーが無くなったことを確認してみてください。
 エラーが無くなったら、自分で組み込んでみて、だめだったらどうすればよいか
 質問してください。
(稲葉) 2015/10/07(水) 12:59

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.