[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『保存前に入力確認するには』(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
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.