VB.NETでDBNullを使用する方法とエラーの解決方法

このQ&Aのポイント
  • VB.NETでAccess接続を試みている際に、列'start'をNullに設定できないというエラーが発生しました。このエラーの解決方法としてDBNullを使用することがあります。
  • 質問文章のコード例では、startとfinishという列の値を取得していますが、これらの列の型は日付/時刻型です。VB.NETでは、実際の値がNullである場合にDBNullを使用することが推奨されています。
  • 対応するテーブルのフィールドの型は、A、B、C、D、Eは数値型(単精度浮動小数点型)、sort_idは数値型(長整数型)、startとfinishは日付/時刻型です。
回答を見る
  • ベストアンサー

DBNullの使い方。

VB.NETでAccess接続を試みております。 以下のようにコーディングしたのですが、「列'start'をNullに設定できません。DBNullを使用してください。」というエラーが出てしまいました。 Dim myA, myB, myC, myD, myE As Double Dim sort_id As Integer Dim start, finish As String Dim rw As DataRow Dim t As Integer t = 14 + 2 * (ii - 16)            rw = DataSet11.Tables("AttTbl").NewRow   myA = xlBook2.Sheets.Item(TextBox4.Text).Range("C" & t).Value myB = xlBook2.Sheets.Item(TextBox4.Text).Range("D" & t).Value myC = xlBook2.Sheets.Item(TextBox4.Text).Range("E" & t).Value myD = xlBook2.Sheets.Item(TextBox4.Text).Range("F" & t).Value myE = xlBook2.Sheets.Item(TextBox4.Text).Range("G" & t).Value sort_id = xlBook2.Sheets.Item(TextBox4.Text).Range("L" & t).Value start = xlBook2.Sheets.Item(TextBox4.Text).Range("H" & t).Value finish = xlBook2.Sheets.Item(TextBox4.Text).Range("H" & (t + 1)).Value rw.Item("A") = myA rw.Item("B") = myB rw.Item("C") = myC rw.Item("D") = myD rw.Item("E") = myE rw.Item("sort_id") = sort_id rw.Item("start") = start rw.Item("finish") = finish 対応するテーブルのそれぞれのフィールドの型は以下のとおりです。 A 数値型(単精度浮動小数点型) B      数値型(単精度浮動小数点型) C      数値型(単精度浮動小数点型) D      数値型(単精度浮動小数点型) E      数値型(単精度浮動小数点型) sort_id   数値型(長整数型) start    日付/時刻型 finish    日付/時刻型 ながながと申し訳ありませんが、よろしくお願いいたします。

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

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

Accessなんですか?xlBook2.Sheetsとあるけど・・・ ExcelのデータをAccessに流し込もうとしてるんですかね? DatasetにはNULLは入れれないので、ExcelのデータがNULLの場合は、DBNullに置き換えてやる必要があります。

YSK-Dream
質問者

お礼

ありがとうございます! peugeo307さんのいわれるとおり、エクセルデータをアクセスのテーブルに移す作業です。 その逆の作業はうまくいくのですが、エクセル→アクセスはどうもうまくいきません。 最後にアップデートするときもエラーです。 いろいろ調べてDBNullに変換できるようにしてみます。 迅速なご回答、ありがとうございました☆

その他の回答 (1)

回答No.2

IsDBNull関数を使うとよろしいかと。

YSK-Dream
質問者

お礼

ありがとうございます。 あの~、間違ってたら申し訳ないんですが、 IsDBnull関数は、その値がDBNull属性であるか否かを判断するものではないでしょうか? とすると、DBNullに変換する前のものを評価しても当然Falseが返ってくるのではと思ったのですが。。。 違ってたらすいません・・・。ぜんぜんわかっていないもので・・・。

関連するQ&A

  • excelVBAで、Midの引数をLenで指定できる?

    ワークシートSheets1上のセルA1に、次のような文字列があり、 Length 50.0mm この中の、数字の部分だけをユーザーフォームのtextbox1に抜き出したいと思っています。 Length と、単位mmは全ての場合で共通ですが、数字は50.0の場合も5.0の場合もあり、文字数がまちまちです。 textbox1.value=Mid(Sheets("Sheets1").Range("A1").value, 8,Len(Sheets("Sheets1").Range("A1").value-2) のようにMid関数の引数にLen関数を使ったり、 x=Len(Sheets("Sheets1").Range("A1").value textbox1.value=Mid(Sheets("Sheets1").Range("A1").value, 8,x-2) のように変数xを介してみたりしたのですが、mmが表示されてしまいます。 (ちなみにLenを使わずx=13と書くと、mmなしの数値だけがうまく表示されます) VBAはトライ&エラーで使っている状態で、セルの取り扱い(.valueとか.textとか)や変数の宣言はかなり適当です。 この辺りが間違っているんでしょうか?? できればMidとLenを使った解決法、それが無理なら他の方法でも結構ですので、ご教授頂けると助かります。 よろしくお願いします。

  • ユーザーフォーム上にある「テキストボックス」に小数が入力できない

    以前にユーザーフォーム上のテキストボックスにセル値反映する方法を下記(サンプル1)のようにお教えいただいたのですが、下記のようにマクロを組むとテキストボックスに小数が入力できなくなってしまいます。 どのようにしたら、テキストボックスに小数が入力できるようになるのでしょうか? お教えください。 事例)「1.234」とテキストボックスに打ち込むと「1」    「0.856」とテキストボックスに打ち込むと「0」と    なってしまいます。 (サンプル1) 'A1のデータを反映するとした場合 'OptionButton1のコード Private Sub OptionButton1_Click() TextBox1 = Sheets("Sheet1").Range("a1") End Sub 'B1に反映するとして 'OptionButton2のコード Private Sub OptionButton2_Click() TextBox1 = "" End Sub 'TextBox1のコード Private Sub TextBox1_Change() If OptionButton2 = True Then Sheets("Sheet1").Range("B1") = TextBox1.Value End If End Sub

  • このVBA、もうちょっとシンプルにできないですか?

    自力でVBAを書いてみたのですが、長くなってしまいました。 もうちょっとシンプルにするアイディアがあればお願いします。 やりたいことは、 (1)ユーザーフォームのテキストボックス内が空欄だったら「無視」 (2)テキストボックスの中が空欄でなければ「書き込み」 以上のことをやりたいのですが、テキストボックスが6種類あるので単純に記述すると結構長くなってしまいました。 特に問題がなければ、その旨をお願いします。 If TextBox1 = "" Then If TextBox2 = "" Then If TextBox3 = "" Then If TextBox4 = "" Then If TextBox5 = "" Then If TextBox6 = "" Then MsgBox ("得点が入力されていません。") ElseIf TextBox6 <> "" Then Sheets("総合(得点)").Cells(t + 9, u) = TextBox6.Value End If ElseIf TextBox5 <> "" Then Sheets("総合(得点)").Cells(t + 8, u) = TextBox5.Value ElseIf TextBox6 <> "" Then Sheets("総合(得点)").Cells(t + 9, u) = TextBox6.Value End If End If ElseIf TextBox4 <> "" Then Sheets("総合(得点)").Cells(t + 7, u) = TextBox4.Value If TextBox5 <> "" Then Sheets("総合(得点)").Cells(t + 8, u) = TextBox5.Value If TextBox6 <> "" Then Sheets("総合(得点)").Cells(t + 9, u) = TextBox6.Value End If End If End If ElseIf TextBox3 <> "" Then Sheets("総合(得点)").Cells(t + 6, u) = TextBox3.Value If TextBox4 <> "" Then Sheets("総合(得点)").Cells(t + 7, u) = TextBox4.Value If TextBox5 <> "" Then Sheets("総合(得点)").Cells(t + 8, u) = TextBox5.Value If TextBox6 <> "" Then Sheets("総合(得点)").Cells(t + 9, u) = TextBox6.Value End If End If End If End If ElseIf TextBox2 <> "" Then Sheets("総合(得点)").Cells(t + 5, u) = TextBox2.Value If TextBox3 <> "" Then Sheets("総合(得点)").Cells(t + 6, u) = TextBox3.Value If TextBox4 <> "" Then Sheets("総合(得点)").Cells(t + 7, u) = TextBox4.Value If TextBox5 <> "" Then Sheets("総合(得点)").Cells(t + 8, u) = TextBox5.Value ・ ・ ・ こんな感じで規則的に記述しただけです。(文字数が多いので最後は省略しました) 段差がなくて見づらいですが、宜しくお願いします。

  • VBAのTextBox表示について質問します。

    実は、MicrosoftのExcel内にありますVBAを使ってシート内に記載られている内容を Userform内にあるTextBoxに表示させたいと考えています。 UserformにあるTextBoxは、シートのセルに対してTextBoxを1個配置させています。 例えば・・・セルA1に入力されている文字をTextBox1に表示 セルB1に入力されている文字をTextBox2に表示 セルC1に入力されている文字をTextBox3に表示 セルD1に入力されている文字をTextBox4に表示 セルE1に入力されている文字をTextBox5に表示と言う様な感じで表示したいです。 セル表示範囲は、A1~E24までのセルでTextBoxもTextBox24まで存在します。 TextBox1.Text = ThisWorkbook.Sheets("Sheet1").Range("A1") TextBox2.Text = ThisWorkbook.Sheets("Sheet1").Range("B1") TextBox3.Text = ThisWorkbook.Sheets("Sheet1").Range("C1") TextBox4.Text = ThisWorkbook.Sheets("Sheet1").Range("D1") TextBox5.Text = ThisWorkbook.Sheets("Sheet1").Range("E1") TextBox6.Text = ThisWorkbook.Sheets("Sheet1").Range("A2") TextBox7.Text = ThisWorkbook.Sheets("Sheet1").Range("B2") TextBox8.Text = ThisWorkbook.Sheets("Sheet1").Range("C2") TextBox9.Text = ThisWorkbook.Sheets("Sheet1").Range("D2") TextBox10.Text = ThisWorkbook.Sheets("Sheet1").Range("E2") 以降~途中省略 TextBox120.Text = ThisWorkbook.Sheets("Sheet1").Range("E24") と言う様な・・・ 上記の、この様なコードでして行くと事は可能なんですが・・・ もっと短く出来ないでしょうか?

  • ACCESS データ型の一括変更

    ACCESSのデータ型の変更について質問です。 よそからいただいているACCESSファイルがあるのですが、データがテキスト型で入っていまして、数値型(単精度浮動小数点型)に変更し、IIF関数でチェックをしております。(チェックは例えば、テストの点数が90点以上の点をピックアップするなど簡単なものです) ところで、今までテーブルのデザインビューからデータ型を一つ一つテキスト型から数値型(単精度浮動小数点型)へと変更しておりましたが、変更する箇所が多いので、一括して変更できないかと思っております。よろしくお願いします。

  • テーブルに小数点以下の値を入れたい場合

    アクセスのテーブルに0.001と入力したい場合、 データ型を数値型にし、 フィールドサイズは 単精度浮動小数点型と倍精度浮動小数点型では どちらを選べばいいのでしょうか? どちらも小数点の入力ができました。

  • ユーザーフォームの入力をシートに反映

    かなりの初心者(始めて3日)ですが宜しくお願いします。 しかも2点あります。。。 (1)ユーザーフォームにある大量のテキストboxないし、optionboxをエクセルのsheet2に反映させたいです。 で、地道に With Sheets(2) .Range("A22").Value = OptionButton184.Value .Range("A23").Value = OptionButton185.Value .Range("A24").Value = OptionButton186.Value .Range("A25").Value = OptionButton187.Value とAの行を手で直していたのですが、途中で間違えて、手直しは断念しました。そこで、思いついたのが、「ひとつ下のセルに記述する」ということでした。 で、本を見ながら考えたのが、 With Sheets(2) Range("A1").Select ActiveCell.Offset(1, 0).Value = TextBox1.Text ActiveCell.Offset(1, 0).Value = TextBox2.Text ActiveCell.Offset(1, 0).Value = TextBox3.Text まずA1を指定させて、下にずらしていけるかと思ったのですが、全然上手くいきません。しかもsheet1のA1を選択してるようです。どうしてでしょうか??? (2)フォームOKボタンを押して、上記の処理をしても、フォームに記入したものが次にフォームを開いた時に消えていないように、 Me.Hide End Sub で終わらせたのですが、次に開いても残っていません。 無知でお恥ずかしいですが、宜しく御願い致します。

  • VBAで入力数値について

    Excel VBAでTextBoxに入力された数値が整数か小数か判定し、 小数の場合は、下記のようにしたいのですが、どのようにしたらよいのでしょうか。 TextBoxに入力された数値が、 (1)整数の場合・・・A=TextBox1.Value (2)小数点第一位の場合(1.5など)・・・A=TextBox1.Value*10 (3)小数点第二位の場合(1.55など)・・・A=TextBox1.Value*100 どなたかご教授願います。

  • テキストボックス値をシートセルに連続して入力

    リストボックスあ行氏名より選択しテキストボックス1~6の値を実行2クリックでsheet1"E1"から順番に入力されるがか行選択のテキストボックス値1~4を順番に"E7"から入力させたいができるでしょうか。ちなみに下記の方法しかわかりません。また、実行2を押すと同時にテキストボックスを空白にしたいのですが。どなたかコードが解る方よろしくお願いします。 Private Sub 実行2_Click() With Worksheets("入力") .Range("E1") = TextBox1.Value .Range("E2") = TextBox2.Value .Range("E3") = TextBox3.Value .Range("E4") = TextBox4.Value .Range("E5") = TextBox5.Value .Range("E6") = TextBox6.Value .Range("E7") = TextBox7.Value .Range("E8") = TextBox8.Value .Range("E9") = TextBox9.Value .Range("E10") = TextBox10.Value End With End Sub

  • ユーザーフォームでの登録&編集

     ユーザーフォームのリストボックス(RowSource,P6:A26)で選択し14個のテキストボックスで編集しコマンドボタンでSheet(P6:AC26)にコピペしていますが、下記のコードだと無制限に登録されてしまいます。Sheetの範囲内で登録&編集のコードの書き方がありましたらご教示賜りたく存じます。(番号は自動入力でなくてもいいです。) Windows7・SP1 Office2010 Private Sub CommandButton2_Click() Dim varRag As Variant Dim myArray As Integer Dim i As Long varRag = Array(txtID, txtTextBox2, txtTextBox3, txtTextBox4, txtTextBox5, txtTextBox6, txtTextBox7, txtTextBox8, txtTextBox9, txtTextBox10, txtTextBox11, txtTextBox12, txtTextBox13, txtTextBox14) If TextBox3.Text = "" Then MsgBox "登録すべき内容がありません!", vbExclamation, "確認" Exit Sub End If Application.ScreenUpdating = False Application.Calculation = xlCalculationManual If ListBox1.ListIndex = -1 Then 'リストが選択していなかったら、 Cells(Rows.Count, 16).End(xlUp).Offset(1).Select For myArray = 0 To 9 With Selection txtID = .Row - 5 .Offset(, myArray) = varRag(myArray) End With Next myArray Else i = ListBox1.ListIndex + 6 Range("P" & i).Value = i - 5 Range("Q" & i).Value = TextBox2.Text Range("R" & i).Value = TextBox3.Text Range("S" & i).Value = TextBox4.Text Range("T" & i).Value = TextBox5.Text Range("U" & i).Value = TextBox6.Text Range("V" & i).Value = TextBox7.Text Range("W" & i).Value = TextBox8.Text Range("X" & i).Value = TextBox9.Text Range("Y" & i).Value = TextBox10.Text Range("Z" & i).Value = TextBox11.Text Range("AA" & i).Value = TextBox12.Text Range("AB" & i).Value = TextBox13.Text Range("AC" & i).Value = TextBox14.Text End If 'データをクリア ListBox1.ListIndex = -1 ID.Text = "" TextBox2.Text = "" TextBox3.Text = "" TextBox4.Text = "" TextBox5.Text = "" TextBox6.Text = "" TextBox7.Text = "" TextBox8.Text = "" TextBox9.Text = "" TextBox10.Text = "" TextBox11.Text = "" TextBox12.Text = "" TextBox13.Text = "" TextBox14.Text = "" Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic End Sub Private Sub ListBox1_Change() Dim targetRow As Integer With ListBox1 targetRow = .ListIndex ID.Text = .List(targetRow, 0) TextBox2.Text = .List(targetRow, 1) TextBox3.Text = .List(targetRow, 2) TextBox4.Text = .List(targetRow, 3) TextBox5.Text = .List(targetRow, 4) TextBox6.Text = .List(targetRow, 5) TextBox7.Text = .List(targetRow, 6) TextBox8.Text = .List(targetRow, 7) TextBox9.Text = .List(targetRow, 8) TextBox10.Text = .List(targetRow, 9) TextBox11.Text = .List(targetRow, 10) TextBox12.Text = .List(targetRow, 11) TextBox13.Text = .List(targetRow, 12) TextBox14.Text = .List(targetRow, 13) End With End Sub

専門家に質問してみよう