DataTableの値を変数に代入したい

このQ&Aのポイント
  • Do Loopのところで『オブジェクト参照がオブジェクトインスタンスに設定されていません』とエラーが出ます。
  • データグリッドビューに表示はうまくいくんですが。
  • DBから『職員ID』・『氏名』を取得しSyokuin(,)の2次元配列に代入したい。
回答を見る
  • ベストアンサー

DataTableの値を変数に代入したい

DataTableの値を変数に代入したい 以下のコードのにてDBから『職員ID』・『氏名』を取得しSyokuin(,)の2次元配列に代入したいのですが Do Loopのところで『オブジェクト参照がオブジェクトインスタンスに設定されていません』とエラーが出ます。 ほかのところでほぼ同様のコードでデータグリッドビューに表示はうまくいくんですが? Using OleCn As New OleDbConnection(省略) Using OleCmd As New OleDbCommand(省略) Using OleDAdp As New OleDb.OleDbDataAdapter() OleCmd.Connection = OleCn '配列取得 OleDAdp.SelectCommand = OleCmd OleDAdp.Fill(OleDSet, "職員") Dim i As Integer = 0 Dim jAs Integer = 0 Do Until j= OleDSet.Tables("職員").Columns.Count - 1   Do Until i = OleDSet.Tables("職員").Rows.Count - 1   Syokuin(j, i) = OleDSet.Tables("職員").Rows(i)(j)   i += 1   Loop j += 1 Loop End Using End Using End Using ご教授お願いします

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

OleDSet.Tables("職員")を DataTable型の変数に代入して 取得したいデータが本当に取得できているのかを確認してみましょう Dim dt as DataTable dt = OleDSet.Tables("職員") として dtが Nothingになっていないかとか ColumnsやRowsが取得したテーブル通りなのか ・・・

Alshark
質問者

お礼

ありがとうございます。 基本的な間違いでした 宣言をDim Syokuin(,) As String で宣言した後にReDimで要素を決定していなかったためでした。 ExcelVBAではReDimなしで行けたのでVB2008も同じだと思ってました。

関連するQ&A

  • VB2010 SQLのUPDATE文エラー

    VB2010とAccess2007で使用しています データを日付順に連番を付けるコードを作成したのですが『UPDATE文構文エラーです』等のエラーが発生します? ご教授お願いします。 Private Sub Button連番_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button連番.Click Dim DT As New DataTable Try Using OleCn As New OleDbConnection(mdbPath) Dim SQL As String = "" SQL = "SELECT * FROM tableA ORDER BY 依頼日" Using DA As System.Data.OleDb.OleDbDataAdapter = _ New System.Data.OleDb.OleDbDataAdapter(SQL, OleCn) DT.Clear() DA.Fill(DT) End Using End Using Using OleCn As New OleDbConnection(mdbPath) Dim SQL As String = "" SQL = "UPDATE tableA SET No = @no WHERE 登録ID_Export = @登録ID" Dim OleCmd As New OleDbCommand(SQL) OleCmd.Connection = OleCn OleCn.Open() OleCmd.Parameters.Add("@no", OleDbType.Integer) OleCmd.Parameters.Add("@登録ID", OleDbType.Integer) For i As Integer = 1 To DT.Rows.Count OleCmd.Parameters("@no").Value = i OleCmd.Parameters("@登録ID").Value = CInt(DT.Rows(i)("登録ID_Export").ToString) OleCmd.ExecuteNonQuery() Next i OleCmd.Dispose() OleCn.Dispose() End Using Catch ex As Exception MessageBox.Show(ex.ToString, "例外発生") Exit Sub End Try MsgBox("ok") End Sub

  • エクセルVBAの繰り返し処理の質問

    C列にある項目とG列にある項目を比較して、 一致し、H列にある数字が10以上ならば、B列にフラグ1を立てる という処理を行いたいんですが、 下記ぐらいまでしか作れず、うまくいきません・・・ Sub フラグを立てる処理() Dim i As Integer Dim j As Integer Dim k As Integer i = 1 j = 1 Do j = j + 1 Do i = i + 1 If Cells(j, 8) > 9 Then Cells(i - 1, 4) = 1 End If Loop Until Cells(i, 3) <> Cells(j, 7) Or Cells(i, 3) = "" Loop Until Cells(j, 7) = "" End Sub わかる方がいらっしゃいましたら、お願いします。

  • VBA 九九 Do While

    VBAのDo Whileステートメントを使って九九の表をつくりたいのですが、何度やっても途中で詰まり、実行に至りません。 For NextとDo untilではできたと思うのですがDo Whileがどうしてもわからなくて… どなたか助けてください。お願いします。 Sub 九九計算_for() Dim i, j As Integer For i = 1 To 9 For j = 1 To 9 Cells(i, j).Value = i * j Next Next End Sub Sub 九九計算_do_until() j = 1 Do i = 1 Do Cells(j, i).Value = i * j i = i + 1 Loop Until i = 10 j = j + 1 Loop Until j = 10 End Sub

  • 1から入力された数までの素因数を数えるプログラム

    こんにちは 1から入力された数(N)までの素因数を数えるプログラムを 作成したいのですが、うまくいきません。 たとえば10と入力すると2と表示されてしまいます。 どこがおかしいのかわかりません。 どなたか教えてください。おねがいします。 N個の配列を用意し、1を入れていき、 素因数でない数の要素には0をいれて、 最終的に1が入っている配列の数を数えて1~Nまでの 素因数の数を数える方法を考えています。 Dim M As Integer Dim N As Integer Dim i As Integer Dim j As Integer Dim sum As Integer Dim L(1000) As Double N = Val(TextBox1) M = N i = 1 Do Until i > N L(i) = 1 i = i + 1 Loop i = 2 Do Until i > M j = i * 2 Do Until j > M L(j) = 0 j = j + 1 Loop i = i + 1 Loop sum = 0 For i = 2 To N If L(i) = 1 Then sum = sum + 1 End If Next i

  • 完全一致したら複数のセルを順に代入するマクロは?

    エクセルのSheet1のA列にある文字列と、Sheet2にあるA列にある文字列と完全一致したら、前者のセルの右右右隣セル(一致したセルから数えて4番目のセル)から3番目までのセルに、後者のセルの右隣セル(一致したセルから数えて2番目のセル)から3番目までの文字列を順に代入するマクロをお教えください。つまり代入開始セルをSheet1のD列にしたいのです。(実は任意の列からにしたのですが…)。単純にvlookup関数を使えばいいのですが、VBAで行いたいのです。 一致したセルの右隣のセルから順に代入するマクロは以下で解決済みです。以下のマクロを編集して実行したいのですが、どこをいじったらよいかわかりません。 なお、代入したいセルを右の任意のセルまで引き延ばしたい場合、以下のコード任意Loop Until Coln1 = 4の右辺の数字を変更すればよいことまではわかっています。どうぞ、よろしくお願い申し上げます。 ---------------- Sub 試験() Dim Row1 As Integer Dim Coln1 As Integer Dim Row2 As Integer Dim Coln2 As Integer Set WS1 = Worksheets("Sheet1") Set WS2 = Worksheets("Sheet2") Coln1 = 1 Coln2 = 1 For Row1 = 1 To WS1.Cells(Rows.Count, 1).End(xlUp).Row For Row2 = 1 To WS2.Cells(Rows.Count, 1).End(xlUp).Row If WS2.Cells(Row2, 1) = WS1.Cells(Row1, 1) Then Do Coln1 = Coln1 + 1 Coln2 = Coln2 + 1 WS1.Cells(Row1, Coln1) = WS2.Cells(Row2, Coln2) Loop Until Coln1 = 4 Coln1 = 1 Coln2 = 1 End If Next Row2 Next Row1 End Sub

  • VB Shell sort

    初心者です。 シェルソート後の数字がうまく表示できません。 見よう見まねでしているので、どこがどうおかしいのかわかりません。 大変、恐縮ですが宜しくお願いいたします。 ----------------------------------------- Public Class Form1 Dim intNumber() As Integer = {2, 6, 4, 8, 10, 12, 89, 45, 37} Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Display unsorted numbers to lists For i As Integer = 0 To 8 lstShell.Items.Add(intNumber(i)) Next End Sub Sub btnSort2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSort2.Click Dim i As Integer, j As Integer, k As Integer Dim temp As Integer Dim gap As Integer Dim count As Integer gap = count / 2 Do While gap > 0 k = 0 Do While k < gap j = k + gap Do While j < count i = j - gap Do While i >= k If intNumber(i + gap) > intNumber(i) Then temp = intNumber(i + gap) intNumber(i + gap) = intNumber(i) intNumber(i) = temp Else Exit Do End If i = i - gap Loop j = j + gap Loop k = k + 1 Loop gap = gap / 2 Loop 'Display numbers to list lstShell.Items.Clear() For i As Integer = 0 To 8 lstShell.Items.Add(intNumber(i)) Next End Sub End Class

  • コードの簡略化(変数を少なくできますか?)

    カレンダーの作成(4ヶ月分)で 月、曜日、月-日、Do_ITを書き出すセル幅及び高さを VBAのコードでそれぞれ指定しています。 現在、以下のコードですが いかにも変数(i2-i10)の数が多くと無駄のように思えます。 もう少し、スッキリ短く成るコードに出来ませんか ? Dim i1 As Integer, i2 As Integer, i3 As Integer, i4 As Integer Dim i5 As Integer, i6 As Integer, i7 As Integer, i8 As Integer Dim i9 As Integer, i10 As Integer 'セル幅の調整 Columns("B:H").ColumnWidth = 10 'セルの高さ調整 (月の行) For i1 = 1 To 40 Step 13 Rows(i1).RowHeight = 14 Next 'セルの高さ調整 (曜日の行) For i2 = 2 To 41 Step 13 Rows(i2).RowHeight = 14 Next 'セルの高さ調整(月-日の行) For i3 = 3 To 11 Step 2 Rows(i3).RowHeight = 16 Next 'セルの高さ調整(月-日の行) For i4 = 16 To 24 Step 2 Rows(i4).RowHeight = 16 Next 'セルの高さ調整 (月-日の行) For i5 = 29 To 37 Step 2 Rows(i5).RowHeight = 16 Next 'セルの高さ調整 (月-日の行) For i6 = 42 To 50 Step 2 Rows(i6).RowHeight = 16 Next 'セルの高さ調整 - Do it For i7 = 4 To 12 Step 2 Rows(i7).RowHeight = 40 Next 'セルの高さ調整 - Do it For i8 = 17 To 25 Step 2 Rows(i8).RowHeight = 40 Next 'セルの高さ調整 - Do it For i9 = 30 To 38 Step 2 Rows(i9).RowHeight = 40 Next 'セルの高さ調整 - Do it For i10 = 43 To 51 Step 2 Rows(i10).RowHeight = 40 Next

  • VBA セルの値を取得する

    下記のはランダムにチーム分けするものです。 TmCnt = 5がチーム数です。 Sub Sample() Dim Total As Integer Dim TmCnt As Integer Dim Data1 As Variant Dim Data2() As String Dim i As Integer, j As Integer, k As Integer Total = Cells(Rows.Count, 1).End(xlUp).Row TmCnt = 5 Data1 = Range("A1:A" & Total).Value ReDim Data2(1 To Total) Randomize For i = TmCnt To 1 Step -1 j = Int(Rnd * i) + 1 Data2(i) = Data1(j, 1) Data1(j, 1) = Data1(i, 1) Next i For i = Total To TmCnt + 1 Step -1 j = Int((i - (TmCnt + 1) + 1) * Rnd + TmCnt + 1) Data2(i) = Data1(j, 1) Data1(j, 1) = Data1(i, 1) Next i i = 1 Do For j = 1 To TmCnt k = k + 1 Cells(i, j + 2).Value = Data2(k) If k = Total Then Exit Sub Next j i = i + 1 Loop End Sub TmCnt = 5をセル「B1」にチーム数を入力し、(例「6」「4」など)マクロを実行したいのです。 検索しましたところ、 セルの値を取得するにはRange("A1").Valueを入力だそうです。 TmCnt = 5を下記に書き換えるにはどのようにしたら良いでしょうか? Dim s As String s = Range(“B1”).Value Debug.Print(s) 宜しくお願いします。

  • 変数iもjも同じく値を保持できるからどちらを使って

    このサンプルコードは、 変数iもjも同じく値を保持できるから、test1を使ってもtest2を使っても一緒なのでしょうか? Option Explicit Dim i As Integer Sub test1() Static j As Integer j = j + 1 Debug.Print j End Sub Sub test2() i = i + 1 Debug.Print i End Sub ご回答よろしくお願いします。

  • DataTableのデータを保存したい

    VB初心者です VB2008を使用してカロリー計算ができるプログラムを作成しています DataTableに摂取カロリーと消費カロリーをユーザが追加でき、 そのDataTableのデータをCSVファイルとして保存しようと考えています こちらのサイトhttp://pckowaza.web.fc2.com/html/vbdotnet_datagridview_savetocsv.html からコピーしてやってみたのですが Public Sub SaveToCsv(tempDgv As System.Windows.Forms.DataGridView)' のパラメータ 'tempDgv' に対して引数が指定されていません。 とエラーが出ます どこを直せば良いのでしょうか? 以下、プログラムです '保存したいDataGridViewコントロールの名前を引数として '設定します。 Public Sub SaveToCsv(ByVal tempDgv As DataGridView)   '1行もデータが無い場合は、保存を中止します。   If tempDgv.Rows.Count = 0 Then     Exit Sub   End If   '変数を定義します。   Dim i As Integer   Dim j As Integer   Dim strFileName As String   Dim strResult As New System.Text.StringBuilder   '保存ダイアログでファイル名を設定した場合に処理を実行します。   If Me.sfdCsvFile.ShowDialog = _     Windows.Forms.DialogResult.OK Then     'コラムヘッダを1行目に列記します。     '※ヘッダ行が不要な場合は削除可能です。     For i = 0 To tempDgv.Columns.Count - 1       Select Case i         Case 0          strResult.Append("""" & _          tempDgv.Columns(i).HeaderText.ToString & """")         Case tempDgv.Columns.Count - 1          strResult.Append("," & """" & _          tempDgv.Columns(i).HeaderText.ToString & _          """" & vbCrLf)         Case Else          strResult.Append("," & """" & _          tempDgv.Columns(i).HeaderText.ToString & """")       End Select     Next     'データを保存します。     '※新規行の追加を認めている場合は、次行の     「tempDgv.Columns.Count - 1」を     '「tempDgv.Columns.Count - 2」としてください。     For i = 0 To tempDgv.Rows.Count - 1       For j = 0 To tempDgv.Columns.Count - 1         Select Case j           Case 0            strResult.Append("""" & _            tempDgv.Rows(i).Cells(j).Value.ToString & _            """")           Case tempDgv.Columns.Count - 1            strResult.Append("," & """" & _            tempDgv.Rows(i).Cells(j).Value.ToString & _            """" & vbCrLf)           Case Else            strResult.Append("," & """" & _            tempDgv.Rows(i).Cells(j).Value.ToString & _            """")         End Select       Next     Next     'ファイル名を保存ダイアログで指定した値に設定します。     strFileName = Me.sfdCsvFile.FileName     'Shift-JISで保存します。     Dim swText As New System.IO.StreamWriter(strFileName, _       False, System.Text.Encoding.GetEncoding(932))     swText.Write(strResult.ToString)     swText.Dispose()   End If End Sub DataGridViewの定義?はこれです Designer.vbに書かれていたものです 'DataGridView1 ' Me.DataGridView1.AutoGenerateColumns = False Me.DataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize Me.DataGridView1.Columns.AddRange(New System.Windows.Forms.DataGridViewColumn() {Me.名前DataGridViewTextBoxColumn, Me.カロリーkcalDataGridViewTextBoxColumn}) Me.DataGridView1.DataSource = Me.DataTable1BindingSource3 Me.DataGridView1.Location = New System.Drawing.Point(424, 35) Me.DataGridView1.Name = "DataGridView1" Me.DataGridView1.RowTemplate.Height = 21 Me.DataGridView1.Size = New System.Drawing.Size(429, 422) Me.DataGridView1.TabIndex = 3 ' '名前DataGridViewTextBoxColumn ' Me.名前DataGridViewTextBoxColumn.DataPropertyName = "名前" Me.名前DataGridViewTextBoxColumn.HeaderText = "名前" Me.名前DataGridViewTextBoxColumn.Name = "名前DataGridViewTextBoxColumn" ' 'カロリーkcalDataGridViewTextBoxColumn ' Me.カロリーkcalDataGridViewTextBoxColumn.DataPropertyName = "カロリー(kcal)" Me.カロリーkcalDataGridViewTextBoxColumn.HeaderText = "カロリー(kcal)" Me.カロリーkcalDataGridViewTextBoxColumn.Name = "カロリーkcalDataGridViewTextBoxColumn" '

専門家に質問してみよう