• ベストアンサー

【エクセル】ActiveCellはなぜNullではないのでしょうか?

私は今まで新規のシートを挿入した際のActiveCellは、Nullだと思っていたのですが Sub Empty空白なら() If ActiveCell.Value = Empty Then Debug.Print "空白セルです" End Sub Sub Null空白なら() If ActiveCell.Value = Null Then Debug.Print "空白セルです" End Sub Sub Null空白なら2() If IsNull(ActiveCell.Value) = True Then Debug.Print "空白セルです" End Sub VBAでこのコードを実行すると Emptyの方だけ「空白セルです」となりました。 (1)なぜ空白でもNullだと反応しないのでしょうか? (2)NullとEmptyの違いはなんですか? ご教授よろしくお願い致します。

noname#150498
noname#150498

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

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

Sub test() Sheets.Add Debug.Print ActiveCell.Address End Sub を実行すると、$A$1が返ってきますので、新規シートのActiveCellは、A1セルになっている事が分かります。従って普通のシートの、未使用のセルと同じ事です。セルの値はVariant型なので、初期値はEmptyという事の様です。 田中氏のウェブサイトより Empty値とはバリアント型変数に格納できる特殊な値で、バリアント型変数が初期化されていない状態を表します。Empty値は、数値では0と評価され、文字列としては長さ0の文字列と評価されます。※ Null値とはバリアント型の変数に格納できる特殊な値で、バリアント型変数内に有効な値が入っていないことを意味します。Null値は、バリアント型変数が初期化されていない状態を表すEmpty値や、長さ0の文字列を表すNull文字列(これが""?)とは異なります。 ※他にNull文字(vbNullChar、文字コード0)、値0の文字列=Nullポインタ(vbNullString)なんてのもあって混乱しますね。

noname#150498
質問者

お礼

セルの値はVariant型なのですね。 覚えます。 いろいろあって難しいですね。 ありがとうございます。

その他の回答 (2)

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

>ActiveCellはなぜNullではないのでしょうか この質問の仕方おかしい。ActiveCellと関連づけるのは。言うならシート作成当初の未入力セルか? >ActiveCellはなぜNullではないのでしょうか これはエクセルの仕様というしかない。 他言語や他ソフトを経験しているから、質問のことを、いうのであると思う。エクセルは表計算ソフトで始まって、はじめはマクロやVBAも無かったわけだし、大衆を相手のソフトで有るわけだから、判りやすい使いやすいほうが良い。当初にMS社のエクセル設計者がどう考えたかなど、今さらわかりようも無いが。 判りやすくスペースで埋める当初設計もありえたと思う。 ACCESSのNULLやSQL処理系のNullの扱いなど、私個人からすると、わずらわしく、エクセルはいいなあと思う。 ーー Emptyというのが有るが、あまり使ったことなし。 ここの質問コーナーの質問で答える程度では""一本やりで十分だった。 参考記述 http://www.moug.net/tech/exvba/0100021.htm >Null値とEmpty値は間違いやすいので注意が必要です。Null値はバリアント型(Variant)に有効なデータが入っていないことを示す値であり、Empty値は変数が初期化されていないことを示す値です。Empty値は数値としては0と評価され、文字としては長さ0の文字列("")と評価されます。 === 自分の理論を当てはめるのもよいが、いきなりVBAコード掲出から始まるのでなくて、 具体的にエクセルで、何を(どういう場合を)判定したいのか、具体的に文章で挙げて質問したら。

noname#150498
質問者

お礼

すいませんでした。

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.1

VBAの場合Nullは""であらわしたほうが良かったような…気がします。 If ActiveCell.Value = "" Then Debug.Print "空白セルです" Empty はバリアント型 (Variant) の 1 つで、変数に格納されている値が初期化されていないことを示します。 Null は、バリアント型 (Variant) の 1 つで、有効な値が変数に格納されていないことを示します。 良くわからないですがそうゆうことらしいです。

noname#150498
質問者

お礼

なんだか難しいですね 笑 ありがとうございます。

関連するQ&A

  • VBA null判定

    Accessでテキストボックスの値をテーブルへ書き込むVBAを作成しているのですが、Null判定がうまくいきません。 ◎環境 OS:Windows7Pro Var:Access2010 DB:MySQL5.6 Private Sub cmdSubmit_Click() Dim Rst As DAO.Recordset Dim ErrT As String Set Rst = CurrentDb.OpenRecordset("m_plan", dbOpenDynaset) '各テキストボックス、Null判定 If IsNull(txtPid) Then MsgBox "プランID[" & txtPid & "]が未入力です" Call txtCrer Exit Sub End If If IsNull(txtPName) Then MsgBox "プラン名が未入力です" Call txtCrer Exit Sub End If If IsNull(txtPsdate) Then Me!txtPsdate = #01/01/2010# End If If IsNull(Me!txtPedate) Then Me!txtPedate = #01/01/2010# End If Debug.Print "プランID["; Me.txtPid & "]" Debug.Print "プラン名[" & Me!txtPName & "]" Debug.Print "開始日[" & Me!txtPsdate & "]" Debug.Print "終了日[" & Me!txtPedate & "]" ↑↑↑↑↑↑↑↑↑ ここで、Null判定を行ってますが、データがあるにも関わらず、処理が続行されたり、Null判定結果が起動するたびに変わります。 On Error GoTo err With Rst .MoveLast .AddNew .Fields("PlanID") = Me!txtPid .Fields("PlanName") = Me!txtPName .Fields("PlanSt") = CDate(Me!txtPsdate) .Fields("PlanEn") = CDate(Me!txtPedate) .Fields("P_Remaks") = Me!txtPbikou .Update End With Rst.Close Set Rst = Nothing err: MsgBox "DBエラー" Debug.Print Rst.Type Debug.Print err.Description Call txtCrer End Sub ただし、下記判定だけのボタンとプロシージャーでは、正常に判定されます。 判定だけの、プロシージャー 'Null判定テスト Private Sub cmdtest_Click() If IsNull(txtPid) Then Debug.Print "[" & txtPid & "]" & "Nullです。" Else Debug.Print "[" & txtPid & "]" & "Not Nullです。" End If If IsNull(txtPName) Then Debug.Print "[" & txtPName & "]" & "Nullです。" Else Debug.Print "[" & txtPName & "]" & "Not Nullです。" End If If IsNull(txtPsdate) Then Debug.Print "[" & txtPsdate & "]" & "Nullです。" Else Debug.Print "[" & txtPsdate & "]" & "Not Nullです。" End If Debug.Print "===============================" End Sub どこが間違っているかまったくわかりません、アドバイスを頂けましたら幸いです。

  • Nullについて

    こんばんは!よろしくお願いします。 新規に作成したフォームにコンボボックスを設置して Sub test1() If Form_フォーム1.コンボ0.Value = Null Then Form_フォーム1.コンボ0.Value = "" End If MsgBox Form_フォーム1.コンボ0.Value End Sub Sub test2() If IsNull(Form_フォーム1.コンボ0.Value) = True Then Form_フォーム1.コンボ0.Value = "" End If MsgBox Form_フォーム1.コンボ0.Value End Sub 上記2つのサンプルを実行した時に、 test1のほうだけ 実行時エラー94 Nullの使い方が不正です。 となります。 ウォッチウインドウで見ていくと、 「オブジェクト変数、またはwithブロック変数が設定されていません。」 となりますが 「If Form_フォーム1.コンボ0.Value = Null Then」 を通過したら Nullになります。 何が起こっているのでしょうか?

  • myRange = Null

    VBA Professional Office 2003の試験問題ですが http://vbae.odyssey-com.co.jp/study/sample_2003.html Sub Sample1() Dim myRange As Range On Error Resume Next '――(1) If myRange = Null Then '――(2) Debug.Print "OK" '――(3) Else Debug.Print "NO" '――(4) End If End Sub の(3)が実行されるのは、 myRange = Null が正しいからではなく、 (2)のIf myRange = Null Thenのコードが無視されたから 次のコードの(3)がたまたま実行されただけですか? (2)をIf myRange <> Null Thenにしても OKになりました。

  • VBAで配列のNULL判定

    VBAで下記のように配列に設定したNULL値を判定しようとしました。 Dim str() ReDim Preserve str(2) str(0) = "aaa" str(1) = Null str(2) = "bbb" 以下(1)、(2)の分岐処理ではNullと判定されませんでした。 どのように判定すれば良いでしょうか? (1) If str(1) = Null Then Debug.Print "Null値です" End If (2) If str(1) = "" Then Debug.Print "Null値です" End If

  • エクセルVBA 長さ0の文字列をNullに

    エクセル2000です。 アクセスから出力されたデータをエクセルに貼り付けた場合、問題がおきることがあります。 調べてみたら、アクセスでは、同じ空白でも、レコードが作られてからまだ一回もデータが入っていない状態と、何かデータが入ったことはあるが、削除されて今は空白になった状態をそれぞれ「Null値」と、「長さ 0 の文字列」との 2 種類に区別しているようです。 そのためなのか、それをコピーしてくるとエクセル側でも何もデータが入ってないのに「空白」とはみなされないセルができてしまい、マクロの動きをおかしくしてしまうことがあります。(今日、マクロが想定しない動きをして、その原因がわからず往生しました) やむをえず以下のようなマクロをつくりましたが、Usedrangeが広いとこれもけっこう時間がかかります。 Sub Null化() '長さ0の文字列をNullに   With Application     .ScreenUpdating = False     .Calculation = xlCalculationManual       For Each c In ActiveSheet.UsedRange         If c.Value = "" And Not IsNull(c) Then           c.ClearContents         End If       Next c     .Calculation = xlCalculationAutomatic     .ScreenUpdating = True   End With End Sub 最初から、「長さ 0 の文字列」セルを一度に選択する方法があれば簡単なのですが、そのような方法はありますか? あるいは他のもっとよい方法などがあればご教示くださいませ。  (o。_。)oペコッ

  • Excel VBAフォーム 登録ボタンの作成方法

    いつもお世話になっています。 初めて、Excelのフォームで入力画面を作りました。 複数の項目があって、それを最後に[登録]ボタンをクリックで 表に入れたいのですが、一度にまとめて実行する方法が分かりません。 アドバイスよろしくお願いいたします。 Private Sub cmd_1() Dim i As String If man.Value = True Then ActiveCell = man.Caption End If If woman.Value = True Then ActiveCell = woman.Caption End If ActiveCell.Offset(0, 1).Select End Sub Private Sub cmd_2() Dim i As String If man.Value = True Then ActiveCell = Yes.Caption End If If woman.Value = True Then ActiveCell = No.Caption End If ActiveCell.Offset(0, 1).Select End Sub Private Sub cmd_downlist() Dim ListNo As Long ListNo = group.ListIndex ActiveCell.Value = group.List(ListNo, i) ActiveCell.Offset(0, 1).Select End Sub Private Sub cmd_comment() ActiveCell = comment.Text ActiveCell.Offset(1, -3).Select End Sub

  • 右クリック、ダブルクリックの操作

    勤務表作成してます。 A1に「ON・OFF」を表示します。 「ON」のときに、ダブルクリックで、上のセルを表示、右クリックで「1」を表示します。 「OFF」のときは、コンテキストメニュ-(通常の操作)が出来るようにしたいのですが、ON.OFFの切り替え操作のVBAがわかりません。 よろしくお願いします。 Option Explicit Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) ' ActiveCell = ActiveCell.Offset(-1, 0).Value ' ' If Target = Range("$A$1") Then ' Cancel = True If Range("$A$1").Value = "イベントON" Then Range("$A$1").Value = "イベントOFF" Else Range("$A$1").Value = "イベントON" ActiveCell = ActiveCell.Offset(-1, 0).Value Exit Sub End If Cancel = True If Range("$A$1").Value = "イベントOFF" Then Exit Sub End If End Sub Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) 'ActiveCell = "1" ' If Target = Range("$A$1") Then ' Cancel = True ' If Range("$A$1").Value = "イベントON" Then ' Range("$A$1").Value = "イベントOFF" If Range("$A$1").Value = "イベントON" Then ActiveCell = "1" Else: Range("$A$1").Value = "イベントOFF" Exit Sub End If Cancel = True If Range("$A$1").Value = "イベントOFF" Then Exit Sub End If End Sub

  • IEの中のエクセルから、通常のエクセルへコピーしたい。

    IEの中のエクセルから、通常のエクセルへコピーしたい。 ネット上のアクティブセルから、自分のパソコンのエクセルへセルの内容を コピーしたいのですが、うまくアクティブになりません。 よろしくお願いします。 Sub TENKI() 部材記号 = ActiveCell.Value 部材名 = ActiveCell.Offset(0, 2).Value ActiveCell.Offset(1).Select イエス = MsgBox(部材記号 & " 部材名も必要ですか?", vbYesNo) If イエス = 6 Then ActiveCell = 部材記号 ActiveCell.Offset(0, 2).Value = 部材名 ActiveCell.Offset(1).Select ElseIf イエス = 7 Then ActiveCell = 部材記号 ActiveCell.Offset(1).Select End If End Sub Private Sub Workbook_Open() With Application.CommandBars("Cell").Controls.Add(Temporary:=True) .Caption = "転記" .OnAction = "TENKI" .BeginGroup = True End With End Sub

  • EXCELのVBA NULL、スペースの判断

    EXCEL2000を使用しています. 入力データはテキストファイルで VBAで 空白値のを読み飛ばししたい為 if mid(da_i,1,1) <> " " then goto aa end if で判断していますが、空白データが読み飛ばしできません. (null値ではありません) どのようにすればよいのでしょう? また、null値の場合の読み飛ばしは if mid(da_i,1,1) <> "" then goto bb end if でよいのでしょうか?

  • 「R = ActiveCell」がエラーになる。

    エクセルvbaです。 下記のコードのどこがおかしいのか教えてください。 Sub Macro1() Dim R As Range R = ActiveCell If R Like "*1*" Then MsgBox "1があります" End If End Sub アクティブセルに「1」があれば、 MsgBoxを表示したいのですが うまくいきません。 オブジェクト変数または With ブロック変数が設定されていません。(Error 91) というエラーになります。 If ActiveCell Like "*1*" Then ではなく、一度、変数Rに格納したいです。 解決策をよろしくお願いします。

専門家に質問してみよう