エクセル2003 特定のセルがブランクの場合

このQ&Aのポイント
  • エクセル2003を使っている会社で、入力したデータを別のシートに転記し、そのシートを印刷するマクロを作成しています。
  • 入力が必須の項目があり、必要な項目が未入力の場合はメッセージボックスでお知らせしたいです。
  • セル番号は結合されていて、入力データの全てが必須ではなく、20項目のうち7項目が必須項目と考えています。
回答を見る
  • ベストアンサー

エクセル2003 特定のセルがブランクの場合

会社でエクセル2003を使っています。 縦にデータを入力する表を作りました。 (1)氏名 (2)〒 (3)住所 (4)電話番号 (5)生年月日 (6)性別・・・など20項目を入力します。 入力完了後、別シートにデータを転記してそちらの別シートを印刷するというマクロを作りました。 例えば、その中で入力を絶対してほしい項目がありまして、それを忘れていたらメッセージボックスで「○○が未入力です」とお知らせしたいと思ってます。 いろんなサイトで調べてみたのですが…うまくいかなくて… 例文に従って作ってみたのが Sub 円楕円4_Click() Dim Lesson16 As Range Dim 会員名簿 As Worksheet If 会員名簿.Range("A8") = "" Then MsgBox "氏名が記入されていません。" 会員名簿.Range("A8").Select Exit Sub ElseIf 会員名簿.Range("A9") = "" Then MsgBox "住所が記入されていません。" 会員名簿.Range("A9").Select Exit Sub ElseIf 会員名簿.Range("A10") = "" Then MsgBox "年齢が記入されていません。 " 会員名簿.Range("A10").Select Exit Sub ElseIf 会員名簿.Range("A15") = "" Then MsgBox "生年月日が記入されていません。" 会員名簿.Range("A15").Select Exit Sub ThisWorkbook.SaveAs Lesson16 End Sub     です。 家で作ったサンプルなので、セル番号もちょっと???なのですがお許しください。 入力するデータの全てが必須入力項目ではなくて、20項目のうち7項目が必須項目と考えています。 この項目が未入力であれば「未入力ですよ」とお知らせしたいのです。 また、上の例文のセル番号は単独ですが、会社のファイルのセルは結合しています。 (たとえばA8:C8、A15:G15)と行によって結合範囲も違います。 ど素人の質問で、わかりにくいとは思いますが なにとぞ、アドバイスいただきますようよろしくお願いします。

  • s1023
  • お礼率77% (49/63)

質問者が選んだベストアンサー

  • ベストアンサー
  • eden3616
  • ベストアンサー率65% (267/405)
回答No.1

具体的なフォーマット(様式)が指定されていないので想定ですが。 最下のVBAコードと入れ替えてください。 ■設定及び使用方法 (1)コード内の以下の『'◆チェック対象の設定』箇所を変更してください。  (添付画像の設定ですと以下のようになります。項目は増やせます)  'チェック対象とする範囲を設定   Set myRng = Range("B2:B15")  'チェック行半角カンマ「,」で区切って対象の行番号を設定   myRow = Split("8,9,10,15", ",")  '項目名を半角カンマ「,」で区切って上記チェック行に対応する順番で設定   myTit = Split("氏名,住所,年齢,生年月日", ",") (2)「入力チェック」マクロを実行してください。  チェック対象のセルに未入力があれば、結果がダイアログで表示されます。 ■VBAコード Sub 入力チェック() '◇型宣言 Dim myRng As Range Dim myTit As Variant, myRow As Variant Dim i As Long, cnt As Integer Dim msg As String Dim myTar As Range '◆チェック対象の設定 'チェック範囲 Set myRng = Range("B2:B15") 'チェック行 myRow = Split("8,9,10,15", ",") '項目名 myTit = Split("氏名,住所,年齢,生年月日", ",") '◇チェック処理 '行ループ For i = 1 To myRng.Count   'チェック項目ループ   For j = 0 To UBound(myRow)     'チェック対象且つ、未入力時処理     If myRng(i).Row = CInt(myRow(j)) And Len(myRng(i).Text) = 0 Then       If myTar Is Nothing Then         Set myTar = myRng(i)       Else         msg = msg & vbCrLf         Set myTar = Union(myTar, myRng(i))       End If       msg = msg & "・" & myTit(j)       cnt = cnt + 1     End If   Next j Next i '◇結果表示 If Not myTar Is Nothing Then   myTar.Select   MsgBox "以下の項目が記入されていません。" & vbCrLf & msg, vbOKOnly, "入力必須項目が未記入です" End If End Sub

s1023
質問者

お礼

ありがとうございます。 補足を投稿後、あーでもないこーでもない…としてみました。 「変数の強制を宣言する」のチェックを外して、Option Explicitを削除しましたところできました!!! ありがとうございます。 早速明日、頑張ってみます。

s1023
質問者

補足

ありがとうございます。コピーして貼り付けてみたのですが… 「変数が定義さていません」と「Sub 入力チェック()」の部分が黄色になります。 今は、家のパソコンで「eden3616さま」と同じ表を作って試してみました。 私が何かやらかしているのでしょうか? すいません。 よろしくお願いいたします。

関連するQ&A

  • エクセルVBAでTargetのセルに設定された「名前の定義」の取得方法は?

    例えば、A1、B2、C3セルに「名前の定義」で、それぞれ入力A、入力B、入力C という名前がつけてあります。 それらのセルに入力があった場合、Select Caseで分岐させ作動するマクロをつくりました。 簡略化すると以下のようなもので、一応正しく作動します。 Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("入力A,入力B,入力C")) Is Nothing Then Exit Sub Select Case Target.Address(0, 0) Case "A1" MsgBox "A処理します。" Case "B2" MsgBox "B処理します。" Case "C3" MsgBox "C処理します。" End Select End Sub ただ、せっかくセルに名前を定義してあるのに、個々の入力セルの判定をTarget.Addressでしているのが不満です。 ( ̄~ ̄;) 定義された名前を使えないかと以下のようにやってみましたが実行時エラーで「サポートしてません」となってしまいます。 (T.T) Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("入力A,入力B,入力C")) Is Nothing Then Exit Sub Select Case Target.Names.Name 'ここでエラー Case "入力A" MsgBox "A処理します。" Case "入力B" MsgBox "B処理します。" Case "入力C" MsgBox "C処理します。" End Select End Sub どうやったら、Targetに設定されている名前を取得できるのでしょうか? (^∇^`)? 実際の例はもっと対象が多いので、Select Caseを使わない以下の方法は避けたいのです。 If文の羅列(これでも正しく作動はします。) Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("入力A,入力B,入力C")) Is Nothing Then Exit Sub If Not Intersect(Target, Range("入力A")) Is Nothing Then MsgBox "A処理します。" ElseIf Not Intersect(Target, Range("入力B")) Is Nothing Then MsgBox "B処理します。" Else MsgBox "C処理します。" End If End Sub なにとぞよろしくお願いします。 (o。_。)oペコッ

  • エクセルの特定のセルの値が変化したらマクロを自動実行させたい。

    エクセルの特定のセルの値が変化したらマクロを自動実行させたい。 エクセルにてシート1のB5に英数字を入力すると シート2のA列を検索し同じ値があるとその行のB列にある値をH6に表示をします。  【例】   シート1のB5に「A5684」と入力   シート2     A   B   1:A5682 パイン    2:A5683 リンゴ   3:A5684 バナナ   シート1のH6に「バナナ」と表示される シート2のA列にない場合はメッセージボックスで「データがありません」と表示します。 またシート3のA1に数字を入れておき、以下のマクロ、  'Sheet3から印刷すべき連番を獲得します。 Worksheets("Sheet3").Select Range("A1").Select 番号 = ActiveCell 連番 = "A" & Application.WorksheetFunction.Rept("0", 5 - Len(番号)) & 番号  'Sheet3の番号セル「B1」を更新します 番号 = 番号 + 1 ActiveCell.FormulaR1C1 = 番号  'Sheet1のセル「H7」欄に連番を表示します。 Worksheets("シート3").Select Range("B1").Select ActiveCell.FormulaR1C1 = 連番 Worksheets("シート1").Select Range("H6").Select '調べたいセルを記入 If IsError(ActiveCell.Value) Then errval = ActiveCell.Value Select Case errval Case CVErr(xlErrDiv0) MsgBox "#DIV/0! エラー" Case CVErr(xlErrNA) If vbOK = MsgBox(" データがありません") Then Exit Sub End Select End If Sheets("シート1").PrintOut Copies:=1 Range("B5").Select Selection.ClearContents '消去 Range("B5").Select End Sub でシート1のH7に(=シート3!B1)として 印刷ごとに1、2、3、と連番を入れています。 フォームで作成したボタンを押すとH6とH7の値が印刷されます。 そしてB5の値がDeleteされ(よってH6は#N/Aとなる) B5にカーソルが行って入力待ち状態になるようにしてあります。 これで、シート1のB5の値が変化又はH6が変化したら 印刷ボタンを押して印刷ではなく自動印刷されるように出来ますか? Private Sub Worksheet_Change(ByVal Target As Range)  If Target.Column = B And Target.Row = 5 Then を使いましたが 「コンパイルエラー」とか Targetの所が色つきになって「End Sub」が必要です。 となってうまく出来ません。 お願いします。

  • Excel VBAでメッセージとセル選択のループを回避したい

    Excel VBAでメッセージとセル選択のループを回避したい 初歩的な質問ですみません。 セルA1で入力規則のリストから"重要"が選択されたらメッセージボックス「重要です」を表示し、離れた複数セル(D4,F7など10カ所ほど)の枠線を太く、A1が"重要"以外になったら枠線を細くします。複数セルは名前の定義で「重要項目」とし、下のコードで一応できました。 でも、「重要項目」のセルに入力Enterするたびにメッセージが表示されてしまい、「重要項目」が選択されたままです。 メッセージはA1が"重要"になるごとに一度だけ表示し、セル選択は元の位置に戻したいのです。 バージョンはExcel2003です。よろしくお願いします。 -------------------------------------- Private Sub Worksheet_Change(Byval Target As Range) If Range("A1") = "重要" Then MsgBox "重要です" Range("重要項目"). Select Selection. BorderAround Weight = 4 Else If Range("A1") <> "重要" Then Range("重要項目"). Select Selection. BorderAround Weight = 2 End IF End Sub

  • エクセルマクロ セル内の値の抜き出しと入力の値との

    すみません、ハマっております。 下記マクロにて、A2セル内にある(例)「111-22222-5555-666-1」の中のと入力した5555とのマッチングのマクロを作っているのですが、どうしてもA2値がemptyになってしまいうまくマッチングできません。どうしたらよいでしょうか?お力お貸しください。 Private Sub CommandButton1_Click() Unload 番号入力 Dim OdrNum As String If TextBox1.Value = "" Then Exit Sub Else OdrNum = TextBox1.Value While Mid(A2, 11, 4) <> OdrNum '該当番号の欄になるまで不要行削除 If Mid(A2, 11, 4) = "" Then MsgBox "該当番号はありませんでした。" Exit Sub Else End If Rows("2:2").Select Selection.Delete Shift:=xlUp Wend MsgBox "処理終了" End If End Sub

  • エクセルで行を非表示にするとアクティブなセルが・・・

    エクセルで行を非表示にするとアクティブなセル?行?がどこかわからなくなり、マクロでアクティブなセルを移動するときにエラーが出ます。 Sub example() ActiveSheet.Range("D3").Select Do Until ActiveCell = 23 If ActiveCell <> "" Then ActiveCell.Offset(1, 0).Select ElseIf ActiveCell <> "" Then ActiveCell.Offset(1, -3).Select ElseIf ActiveCell <> "" Then ActiveCell.Offset(1, -6).Select Else: ActiveCell.EntireRow.Select Selection.EntireRow.Hidden = True ActiveCell.Offset(0, -6).Select End If Loop End Sub 一番下のActiveCell.Offset(0, -6).Select にエラーが出るのですが、どうすればセルを移動できるでしょうか?

  • エクセルで特定のセルへの直接入力だけを禁止したいんです。

    過去の質問を参考に『セルをダブルクリックすると"○"と入力される』というマクロを○⇒●⇒-⇒  ⇒○⇒・・・として使っているんですが、ダブルクリックの度にセルが直接入力の状態(縦の棒の点滅)になってしまい、一度他のセルをクリックしないと次へ進めずに困っています。 良い方法ってあるのでしょうか? ちなみに使用しているマクロは Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Const rng As String = "A1:A3" '処理対象のセル範囲 If Not Application.Intersect(Target, Range(rng)) Is Nothing Then If Target.Value = "" Then Target.Value = "○" ElseIf Target.Value = "○" Then Target.Value = "●" ElseIf Target.Value = "●" Then Target.Value = "-" Else Target.ClearContents End If End If End Sub というものです。 よろしくお願いします。

  • VBAのinputboxで何もいれずに[OK]を押した時エラーになります

    よろしくお願い致します。 EXCELのVBAで「inputbox」を使ってセルを選択させたいと考えております。 下記のコードだと「キャンセル」や「×」で閉じられた時はmsgbox「キャンセル」が出てExit subするのですが、何も入力しないで「OK」を押した場合がどうしてもエラー(入力した数式は正しくありません)になります。 いろいろ調べて試したのですがどうしてもできず困っています。 どなたか教えてください。 Sub test() Dim myAns As Range On Error Resume Next Set myAns = Application.InputBox(Prompt:="セルを選択してください。", Title:="セル選択", Type:=8) On Error GoTo 0 If myAns Is Nothing Then MsgBox "キャンセル" Exit Sub ElseIf myAns = "" Then MsgBox "最低1つは選択してください" Exit Sub Else MsgBox myAns.Address(0, 0) End If End sub

  • ExcelVBAで、広範囲セルの空白チェックをしたいと思います。

    ExcelVBAで、広範囲セルの空白チェックをしたいと思います。 以下のようなExcelシートがあります。 ・10行目まではタイトル行 ・データ入力可能セル範囲はA11~AF65536 全てのデータ範囲を削除するために、以下のコードを作成しました。 動きとしては問題ないのですが、データが存在しない場合の 処理時間が長くなってしまいます。 Sub 全データ削除() Dim endrow As Long Dim mydelete As Integer Dim myrange As Range endrow = Range("A11").End(xlDown).Row For Each myrange In Range("A11:AF" & endrow) If myrange.Value <> "" Then GoTo 削除処理 End If Next myrange MsgBox "データがありません。" Exit Sub 削除処理: mydelete = MsgBox("全てのデータを削除しますか?", vbOKCancel) Select Case mydelete Case vbOK Rows("11:65536").Delete Range("D4").Formula = "=COUNTA(A11:A65536)" MsgBox "データを削除しました。" Exit Sub Case vbCancel MsgBox "キャンセルされました。" Exit Sub End Select End Sub データ範囲が65536行までになってしまうため時間がかかっているのだと思いますが、 回避方法がわかりません。 ご教授お願いいたします。

  • 特定のセルのカーソル移動

    こんばんは。教えてください。 入力可能なセルが2個だけのエクセルの表があります。 C6には「年」、E6「日付」が入ります。 それ以外のセルに触ると「ここは入力できません」と 表示が出て、C6にカーソルが戻ります。 VBにて作成してあります。 実は、この表は年配のパソコンがほとんど分からない方が 使う表で、保護をかけた時のエラーの長い文章が出ると パソコンが壊れたと思うらしく、わざと、保護はかけずに Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Application.Intersect(Target, Range("A1:IV5,A6,B6,E6,H6:IV6,A7:IV65536")) Is Nothing Then Else MsgBox "「年」と「月」以外の欄には入力できません" Range("C6").Select End Sub と入れて、簡単なメッセージでエラーを伝えるのみで シートの保護はしておりません。 これに追加して、記載することで、 C6のセルに入力後、「enter」を押すとE6にカーソルが移動 E6のセルに入力後、「enter」を押すとC6にカーソルが移動 が出来るようにしたいのです。 つまり、C6に入力したらE6に、E6に入力したらC6にカーソルが 「入力できるセル」だけを行き来したいのです。 どなたか教えてください。 宜しくお願いいたします。

  • ワークシートのコンボボックスのExcelVBA

    ワークシートのコンボボックス(Active X コントロール)で選択されたデータがあるかどうか チェックしたいのです。セルならば、うまくいくのですが、コンボボックスの場合はうまくいきません。 クライアント名と品名は、コンボボックスから選択するようにしています。(下記のスクリプトは、わから ないのでセル番地を任意に入れています。) 金額は、セル入力ですのでうまくチェックできています。 どうしたらいいのでしょうか?ご指導お願いいたします。 Private Sub cmd_登録_Click() Dim chkStr As String '入力チェックのメッセージ文 '---------入力データのチェック------------- '初期値を代入する。 chkStr = "" 'クライアント名が未入力の場合 If IsEmpty(ActiveSheet.cboクライアント.ListIndex) Then chkStr = "クライアント名を選択してください" Range("B5").Select   '品名が未入力の場合 ElseIf IsEmpty(Range("E5")) Then chkStr = "品名を選択してください" Range("E5").Select   '売上金額が未入力の場合    ElseIf IsEmpty(Range("W14")) Then chkStr = "売上金額を入力してください。" Range("W14").Select Else MsgBox "登録を行います" End If '入力漏れがある場合は、プロシージャを抜ける If chkStr <> "" Then MsgBox chkStr, vbCritical, "登録エラーです。" Exit Sub End If