エクセルで空白セルをチェックする方法

このQ&Aのポイント
  • エクセル2010で、複数のシートの特定のセルが空白の場合にアラームを表示するマクロの修正方法を教えてください。
  • 別のBookにおいて、入力シートだけをチェックするようなマクロに修正したいのです。
  • 先日教えてもらったコードでは、入力シート以外のシートにも何か入力してしまうとエラーメッセージが表示されてしまいます。
回答を見る
  • ベストアンサー

エクセルで保存時に空白セルをチェックしたい

エクセル2010です。 先日ここで、複数あるシートの特定のセルが空白の時には「A1セルが空白です」というアラームが出るようなマクロを丁寧に教えてもらってうまく行ったのですが、別のBookで同じアラームを出したいのですが、少し条件が違っており、自分では何とも修正できませんのでお助け下さい。 先日教わったコードは複数ある全シートの特定のセルについて検証するのですが今度のBookでは、入力シートが予め余分に10枚程度コピーで作ってあるので、同じコードでは未入力の書式シートにも何か入力していないと保存できないことになり、未入力のシートに何か入れてしまうと入力シートとの区別がつかないことになります。 つまり、Activeシートだけチェックするようなマクロにしたいのですが。 ちなみに先日教えてもらったコードは下記の通り。 Option Explicit Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim wkCount As Integer Dim wkCounter As Integer With ThisWorkbook wkCount = .Sheets.Count For wkCounter = 1 To wkCount If .Sheets(wkCounter).Range("A1").Value = "" Then MsgBox Format(wkCounter, "0") & "番目のシートの" & "A1が未入力!", vbCritical + vbOKOnly, "確認" Cancel = True Exit Sub End If

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

  • ベストアンサー
回答No.1

> Activeシートだけチェックするようなマクロにしたい Activeシートだけチェックするようなマクロにしたらいいです。 Private Sub Workbook_BeforeClose(Cancel As Boolean)   If ActiveSheets.Range("A1").Value = "" Then     MsgBox "A1が未入力!", vbCritical + vbOKOnly, "確認"     Cancel = True     Exit Sub   End If End Sub そもそも、どの行がどんな処理をするか理解していないでしょ? それが理解できているなら、この程度の改編はごく簡単なはずですもん。 で、おそらくですが「アクティブシートのみチェック」では あとあと不具合が出ると想定しておいた方が良いですよ。 ま、老婆心ですのでお気になさらず。 ほんとにいつも思うのですが、解らないものは使わない方が良いですよ? 仮に「全シートからデータを消去する」マクロを提示されたらどうします? 言ってしまえば、PCそのものに影響を与えるマクロもVBAで組めたりします。 そんな(私のような)悪意を持ったユーザーがいるかもしれませんよ? 教えてもらうのは悪いことじゃないですが、 教えてもらったら理解する努力をしないと先に進めませんからね。

akira0723
質問者

お礼

いつも的確なご回答ありがとうございます。

akira0723
質問者

補足

仰る通りで、全く意味が分からない場合は諦めます。 書いてもらったコードの意味は何となく分かるのですが、自分で書くと動かない場合が殆どです。 恥ずかしながら、たまには自分で変更したマクロも動くことも有ります(言うほどのこともないですが) 今回の場合は「Count」がいたるところに入っており、これはシートの数を数えているので不要、対象範囲はActiveSheetのA1程度は分かるのですが、自分で書いてみると動かなかったので。 ご指摘&ご回答ありがとうございます。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

>未入力の書式シート は「未入力のシート」のことだとして、1部のセルに VBAではセルに関して、データは、Valueで、書式はNumberFormatなどです。 項目見出しなどが前もって入力されている場合は、セルの場所で判別するしかないかもしれない。ある場合には、該当データがなく空白にせざるを得ない場合もあろう。データが人間なら、見て内容ですぐ判別できようが、プログラムではそうもいかない。 入力済みのシートと、全く入力(多分データの入力か)してないシートの判別はどう判別させればよいのか。VBAコードでなく(どのセルに関して、およびデータについて)文章を使って説明しないと質問にならないのではないか。 それをプログラム化して、対象外のシートはチェックしないようにするとよいのでは。

akira0723
質問者

お礼

ありがとうございます。

  • HohoPapa
  • ベストアンサー率65% (454/692)
回答No.2

アクティブなシートだけをチェックするのであれば、 既に回答されていますし、その答えで無論、十分なんですが... また、先刻承知かもしれませんが、一言。 空の入力用シートが10枚あって、 3枚目まで入力済み。 4枚目を入力して、 4枚目が選択された(アクティブな)状態のまま 保存のオペレーションをしてくれれば期待のチェックが機能します。 他方、 4枚目を入力し、3枚目を選択してから 保存のオペレーションをした場合には 期待のチェックが機能しません。 例えば、 入力者が新規で入力するときに 常識的に考えて、必ず埋めるセルがあるのであれば、 そのセルが埋まっていて、かつ、A1セルも埋まっているかというチェックを 全てのシートで行うというのはどうでしょうか。

akira0723
質問者

お礼

ご丁寧な回答ありがとうございます。 恐らくご提案のコードは当方には持ち腐れになってしまうと思いますので、上記の背景もあり、簡単な安全マクロで対処したいと思います。

akira0723
質問者

補足

毎度まいどお世話になります。 ご指摘の懸念には気付いており、 当然入力すべきセルがあるので、そのセルが埋まっていて、かつ、A1セルも埋まっているかというチェックを全てのシートで行う、のが理想ですが、既にお気づきのように当方には無理との判断から、保存時に最新の入力シートでの保存することをルールにするつもりです。 というより実作業としては入力後、計算結果を記録したらそのまま保存する手順になっているので大きな問題(抜け)にはなりません。 大きな表に入力した生データー(計算に使用した値)を各シートに記録として残しているだけで過去の入力表を再利用することは無いので簡単な方法で対処しようかと。 また、最悪チェック漏れが発生した場合でも、今の調査作業(過去のデータを引っ張り出す)をすることになるだけで今以上のリスクは無いと考えています。

関連するQ&A

  • A列にB列の空白セル以外のセルの数だけ1から番号をふりたい。

    A列にB列の空白セル以外のセルの数だけ1から番号をふりたい。 WIN7 Excel2007でマクロ作成中です。A列にB列の番号の入っているセル(空白セル以外の)の数だけ番号を入力したいのですが、下記コードで、うまく出来ません。どうしたらよろしいでしょうか。 Sub 行番号を入れる2() Dim i As Integer Dim fCnt As Long 'シートが保護されていたら保護を解除 If ActiveSheet.ProtectContents = True Then ActiveSheet.Unprotect End If fCnt = WorksheetFunction.CountA(Sheets("一覧").Columns(2)) 'COUNTA関数でB列の入力セル数を求める。 For i = 1 To fCnt Worksheets("一覧").Cells(i + 3, 1).Value = i Next i End Sub

  • エクセルのマクロについての質問です。

    データをまとめるためのシートを追加し、 一つのブックにある全てのシートのBX6~CG15の範囲をA1を起点に下方向にコピー、 同様に同じブックにある全てのシートのC59~M68の範囲をK1を起点に下方向にコピーするというものを組んでみたのですが、C59~M68の範囲をまとめたものには範囲内の空白のセルも入っていますが、BX6~CG15の範囲をまとめたものは空白のセルが消えてしまいます。 この処理のあとに、A列が空白の行を削除するというものを入れたいので、できればどちらの範囲とも空白を入れたまままとめたいのです。 この空白のセルを消さずにまとめる方法がわかりません。 色々と調べて試していますがうまくいきません。 どこを修整するといいのでしょうか? 超初心者でコードの内容がまだまだわかっていません。 簡単な質問かもしれませんがご教示お願いします。 Sub Macro1() Dim sno As Integer Dim I As Integer sno = Worksheets().Count Sheets(1).Select Sheets.Add For I = 2 To sno + 1 Sheets(I).Range("BX6:CG15").Copy Sheets(1).Range("A65535").End(xlUp).Offset(1, 0).Select ActiveSheet.Paste Next For I = 2 To sno + 1 Sheets(I).Range("C59:M68").Copy Sheets(1).Range("L65535").End(xlUp).Offset(1, 0).Select ActiveSheet.Paste Next End Sub

  • エクセルVBAの質問 開いているもう一つのブックのシート名をすべて取得する方法

    おはようございます。 現在マクロを実行しているブックのシート名を下のようなコードで取得していますが、これを 開いているもうひとつのブックのシート名を マクロ実行しているシート“しーと1”のJ3セル以降に並べる というように変更したいのですが、下のコードを少し変更して 対応できるでしょうか?教えていただけたら助かります。 Sub シート名() Dim i As Integer Dim mySheetCnt As Integer Dim mySheetNam As String Application.ScreenUpdating = False Columns("J:J").Select Selection.ClearContents Range("J2").Select ActiveCell.FormulaR1C1 = "項目名" mySheetCnt = ThisWorkbook.Sheets.Count For i = 2 To mySheetCnt mySheetNam = Sheets(i).Name Sheets("しーと1").Cells(i, 10) = mySheetNam Next i Application.ScreenUpdating = True MsgBox "シート名更新しました。" End Sub

  • エクセル外部リンクのセル番地まで知る方法

    エクセル2013です。他のエクセルブックからリンクを張っているとき、以下のマクロで調べることがわかりましたけど、そこでわかるのは、ブック名どまりであって、シートやセル番地はわかりません。わかりたいのは、こっちのブックのどのシートのどのセルが、あっちのブックのどのシートのどのセルとつながっているかです。 わかる方法はないものでしょうか。なお、このマクロは、以下のホームページに書いてあったものです。 https://www.moug.net/tech/exvba/0060039.html Sub GetLinkInfromation() Dim Var As Variant Dim Msg As String Dim i As Integer Var = ActiveWorkbook.LinkSources(xlExcelLinks) For i = 1 To UBound(Var) Msg = Msg & Var(i) & vbCrLf Next i MsgBox Msg End Sub

  • Excelマクロ 空白セルを無視してCSV出力

    Excelのマクロについて質問します。 <sheet1>の内容をCSVに出力するマクロを使用しているのですが、 問題があって困っています。 <seet1>のA1~K30までは数式が入っていて、<sheet2>のA1~A30に 「OK」と表示されている場合、<sheet1>の対応した行に数値が表示されます。 「OK」以外の場合は、空白になるようにしてあります。 【sheet1】   A    B    C    D    E … 1 100  200  300  400  500 2 100  200  300  400  500 3 100  200  300  400  500 4 100  200  300  400  500 5 6 【sheet2】   A 1 OK 2 OK 3 OK 4 OK 5 6 <sheet1>をマクロでCSV出力する際に、「空白だけど数式が入っているセル」を 除外する方法を教えてください。 現在は「空白だけど数式が入っているセル」もCSV出力されてしまい、「,」が 連続で表示されるので、手動で「,」を削除しています。 ■今使用しているマクロは以下になるので、これに追記する形で改良できないでしょうか。 Sub CSV出力() Dim FileN As String FileN = Application.GetSaveAsFilename( _ InitialFileName:="book1.csv", _ FileFilter:="CSV ファイル (*.csv), *.csv") Sheets("sheet1").Copy ActiveWorkbook.SaveAs Filename:=FileN, FileFormat:=xlCSV ActiveWorkbook.Close Savechanges:=False End Sub よろしくお願いします。

  • エクセルマクロ 【空白セルを無視する方法を教えてください】

    マクロを独学で学び仕事に応用しているのですが、どうしても分からないことが発生してしまい、質問です。 内容は、今、エクセルシートのA1~B5の範囲で A B 1 1 1 2 1 2 3 4 1 5 1 という形で入力されています(見難くてスミマセン)。 この状態から「A列とB列に同じ数字が入力されてれば、メッセージBOXを表示して、なおかつOKボタンを押したら該当セルを赤くする」というマクロを作りたいのですが、本来であれば1行目のみ赤くなるはずなのですが、空白セルが含まれている3行目も赤くなってしまうんです。つまり、空白セルも「同じ値」と認識されているみたいなのですが...。 この場合、空白セルを無視するにはどうしたらよいのですか?教えてください。なお、マクロは以下のように作っています。 Sub ナンバーチェック() Dim Btn As Integer For X = 5 To 10 If Cells(X, "A").Value = Cells(X, "B").Value Then  Btn = MsgBox("同じ数値です", vbOK, "警告")  If Btn = vbOK Then   Cells(X, "A").Interior.ColorIndex = 3 Cells(X, "B").Interior.ColorIndex = 3 End If End If Next End Sub

  • エクセルVBAで検索結果セル位置抽出時、実行時エラーが出ます。

    エクセルVBAで  ・シート"log"のA列にある文字列(A1="AB<CD>EF")を2つにわけて、それぞれシート"edit"のセルに保存(A1="<CD>")(B1="EF")し  ・さらにA1セルをシート"NameList"にあるリストを元に置換する という作業をさせるマクロを組んでいるのですが、 途中で「アプリケーション定義またはオブジェクト定義のエラーです」が出て困ってます。 組んだマクロは下記の通りです。 Option Explicit Option Base 1 Sub Edit() Dim i As Integer Dim log_lastrow As Integer Dim list_lastrow As Integer Dim all As String Dim main As String Dim hn As String Dim chr() As Variant Dim j As Integer Dim k As Integer Dim chrname As String Dim cell As Range Dim line As Integer log_lastrow = 100 list_lastrow = 100 ReDim chr(list_lastrow, 4) For j = 1 To list_lastrow For k = 1 To 2 chr(j, k) = Sheets("NameList").Cells(j , k).Value Next Next For i = 1 To log_lastrow all = Sheets("log").Cells(i, 1).Value hn = Mid(all, InStr(all, "<"), (InStr(all, ">") - 2)) main = Right(all, Len(all) - InStr(all, ">")) Set cell = Sheets("NameList").Columns("A:A").Find(what:=hn, lookat:=xlWhole, MatchCase:=True, matchbyte:=True) line = Sheets("NameList").Range(cell).Row  chrname = chr(line, 2) Sheets("edit").Cells(i, 1).Value = chrname Sheets("edit").Cells(i, 2).Value = main Set cell = Nothing Next End Sub 下から7行目の line = Sheets("NameList").Range(cell).Row 1行上で検索されたセル位置情報の行番号をlineに入れようと思ったのですが、ここでエラーが出ます。何が悪いのかよろしくご教授願います。

  • EXCEL VBA におけるブック終了後の値の保存方法について

    EXCEL VBAについて質問があります。もしかしたら初歩的なことかもしれませんがよろしくお願いいたします。 まず、 Sub Test() Dim i As String i = InputBox("好きな果物を入力してください") Sheets("Sheet1").Range("A1").Value = i End Sub を実行し、ブックを保存して終了する。 ブックを開く Private Sub Workbook_Open() Dim k As String k = Sheets("Sheet1").Range("A1").Value If k = "みかん" Then MsgBox ("a") Else: MsgBox ("b") End If End Sub この処理を Sheets("Sheet1").Range("A1").Value = i というシート上のセルに値を保存するという方法を取らずに iの値をブック終了後もプロシージャ内に持っておくというのは可能なのでしょうか。 Publicで宣言してもブックを一度閉じると やっぱりiの値は保存されませんでした。 どうぞよろしくお願いいたします。

  • 至急お願いします。エクセルのマクロに関してです。

    かなり至急です><エクセル2010のマクロの質問です。 2つ質問があります。 1つ目です。 以下の一連の作業を1つのマクロで行いたいのですが、どうしたらいいでしょうか? 現在は、シート1にデータがあります。 (1)選択した3列を、B~D列に移動する (2)B列に含まれるセルのうち、0(空白)でないセル数分だけシートを追加する。 (たとえば、シート1のB14~B18に数字がはいっていたら、シートを5枚追加するという感じです。) (3)B列に含まれるセルのうち、0(空白)でないセル数分に対し、2行ずつ各シートの3・4行目にコピーする。 (たとえば、シート1のB14~B18に数字がはいっていたら、シート2の3・4行にシート1の14・15行のコピーを貼り付け、シート3の3・4行にシート1の15・16行のコピーを貼り付け、シート4の3・4行にシート1の16・17行のコピーの貼り付ける・・・という感じです。) 現在は (1)Sub () Selection.Cut ActiveCell.Columns("A:C").EntireColumn.Select Selection.Cut Columns("B:B").EntireColumn.Select Selection.Insert Shift:=xlToRight End Sub (2) Sub Macro() Dim n As Long For n = 14 To 18 ' Sheets.Add Next End Sub (3) Sub Macro() Dim n As Long For n = 14 To 18 ' Sheets("Sheet1").Rows(n & ":" & n + 1).Copy _ Sheets("Sheet" & n - 252).Range("A3") Next End Sub と別々のマクロに分けてます。 また(2)(3)でみられる For n = 14 To 18 ' の部分の数字は手動でいれてますが、かなり時間をくってしまうので・・・。 2つ目です。 複数ブックに同じ動作をするエクセルのマクロが知りたいです。 現在100ほどブック(Book1~100)を開いていて、100のブックすべてのSheet1のA1のセルに「1」と入れたいのですが、 そのようなマクロはどうくんだらよろしいでしょうか。 ちなみにExcel2007です。 困っているので、お願いします。

  • 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行までになってしまうため時間がかかっているのだと思いますが、 回避方法がわかりません。 ご教授お願いいたします。

専門家に質問してみよう