クロス集計クエリ内の特定フィールドの有無の確認

このQ&Aのポイント
  • クロス集計クエリの結果を基に別テーブル「tbl_A」にデータを追加したいが、フィールド「01」が存在しないためエラーが発生している。
  • 回避方法として、クロス集計クエリにフィールド「01」を含む条件式を追加することが考えられる。
  • エラーメッセージは「このコレクションには項目がありません」というものであり、フィールド「01」が存在しないことを示している。
回答を見る
  • ベストアンサー

クロス集計クエリ内の特定フィールドの有無の確認

クロス集計クエリ内の特定フィールドの有無の確認 いつもお世話になっております。 ご質問です。 【状況】 毎月クラブの部費を集めています。 テーブル「t_buhi_mas」 フィールド(一部抜粋) ・ID_NO(部員の番号) ・ID_NO_s(枝番) ・nm(部員名) ・year_buhi(年)  2017 ・month_buhi(月)  08 ・buhi(部費)   1000 クロス集計クエリのデータを基に、別のテーブルにデータを追加します。 クロス集計クエリの結果一例 ID_NO ID_NO_s nm 08 09 10 11 1 1 山田 1000 1000 1000 10000 ※08 09 10 11・・・月 この結果を基に別テーブル「tbl_A」にデータを追加したいのですが、以下の場所でエラーとなります。 テーブル「tbl_A」 フィールド(一部抜粋) ・ID_NO(部員の番号) ・ID_NO_s(枝番) ・nm(部員名) ・01(金額を格納)  ~ ・12(金額を格納) Dim h_sql as string Dim h_year as string h_year = "2017" h_sql = "TRANSFORM Sum(buhi) AS buhi_sum " & _ "SELECT ID_NO, ID_NO_s, nm " & _ "FROM t_buhi_mas " & _ "WHERE ([year_buhi] = '" & h_year & "') " & _ "GROUP BY ID_NO, ID_NO_s, nm " & _ "ORDER BY ID_NO, ID_NO_s, month_buhi " & _ "PIVOT month_buhi;" Dim cnn As ADODB.Connection Dim rst1 As ADODB.Recordset Dim rst2 As ADODB.Recordset Dim h_str_fld1 As String Set rst1 = New ADODB.Recordset rst1.Open h_sql, cnn, adOpenKeyset, adLockOptimistic, adCmdTableDirect With rst1 If .RecordCount = 0 Then: GoTo line4: .MoveFirst Set rst2 = New ADODB.Recordset rst2.Open "tbl_A", cnn, adOpenKeyset, adLockOptimistic, adCmdTableDirect Do Until .EOF rst2.MoveFirst Do Until rst2.EOF If !ID_NO = rst2!ID_NO And !ID_NO_s = rst2!ID_NO_s Then For i = 1 To 12 '1月~12月の計算 If i < 10 Then h_str_fld1 = "0" & i Else h_str_fld1 = i End If On Error Resume Next If IsNull(rst1(h_str_fld1)) Then  ←ここでエラー rst2(h_str_fld1) = 0 Else rst2(h_str_fld1) = rst1(h_str_fld1) End If rst2.Update On Error GoTo 0 Next GoTo line3: End If rst2.MoveNext Loop line3: .MoveNext Loop End With rst2.Close rst1.close cnn.close エラーコメント:このコレクションには項目がありません。 要するに、追加先のテーブル「tbl_A」には毎月の部費を格納するフィールド「01」~「12」があるのですが、 クロス集計結果には「01」がないためだと思います。 On Error Resume Next で回避できると思っていたのですが作動しません。 クロス集計クエリ内に、「01」など結果に基づいたフィールドが無い場合の回避方法がご存知であれば教えてください。 何卒宜しくお願い申し上げます。

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

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

> クロス集計クエリ内に、「01」など結果に基づいたフィールドが無い場合の回避方法 は、面倒なので、クロス集計クエリのSQL文の最後のところ、 > PIVOT month_buhi; を > PIVOT Format([month_buhi],'oooo') In ('01','02','03','04','05','06','07','08','09','10','11','12'); のようにして、クロス集計クエリのmonth_buhiフィールドを01から12まで 表示させてみてはどうですか。これなら If IsNull(rst1(h_str_fld1)) Then のところでエラーは出ないと思いますが。

jipang5054
質問者

お礼

piroin654様 早速のご連絡ありがとうございました。 バッチリうまくいきました。 PIVOTの意味も知らず、ただクロス集計クエリをSQLに変換したものを修正しておりました。 とても勉強になりました。 こらからも宜しくお願い申し上げます。

関連するQ&A

  • これらはどういう意味ですか?

    On Error GoTo ErrorHandler Me!開始日 Dim cnn As ADODB.Connection Dim rst As New ADODB.Recordset よろしくお願いします♪

  • ORACLE9iをVB6のADOで更新できません

    こんにちは、ats8181oyajiです VBのカテゴリでも先週同じ質問をしたのですが 回答がありませんでしたので、削除してカテゴリ変更いたしました Set OraSession = CreateObject("OracleInProcServer.XOraSession") Set OraDatabase = OraSession.DbOpenDatabase(OraNet, OraUser & "/" & OraPass, 0&) ' &H2& でオブジェクトで操作する方法はうまく行くのですが Dim cnn As New ADODB.Connection Dim SQLSTR As String cnn.Open "Provider=MSDAORA;" & _ "Data Source=XXXXXXX;", "UID", "PASSWORD" Dim rst As New ADODB.Recordset SQLSTR = "select * from AAAAAA where キー=1" rst.Open SQLSTR, cnn, _ adOpenKeyset, adLockOptimistic If rst.EOF Or rst.BOF Then Exit Function End If '* rst!koumoku = 0 '* rst.Update のようにADOを使うと*の命令文の処理で"エラー3251 オブジェクトまたはプロバイダは要求された操作を実行 できませんでした"となります。 でも不思議なことに、レコードセットのオープンはできていて セレクトした内容も読めています オラクルが9iだと"Provider=MSDAORA"だとダメなのでしょうか? 情報をご存知の方がおられましたら よろしくお願いいたします。

  • アクセスでクロス集計をレポートにする方法

    一応過去質問を調べましたがうまくいかず、よろしくお願いします。 3種類のテーブルをもとに、それぞれについて3種類のクロス集計を行い、 その3つのクエリを一つのクエリにしました。この選択クエリを作る際は、 *をドラッグして全てのフィールドを表示させています。 そのクエリをレコードソースとして、 空のラベル、テキストボックスを必要数置いて以下のようにレポートを作成しましたが、うまくいきません。 どなたか、ご指導ください。 Private Sub Report_Open(Cancel As Integer) Dim db As DAO.Database Dim qd As DAO.QueryDef Dim cnt As Integer Dim fld As DAO.Field Set db = CurrentDb() Set qd = db.QueryDefs(Me.RecordSource) For cnt = 1 To qd.Fields.Count - 1 Set fld = qd.Fields(cnt) Me("Label" & cnt).Caption = fld.Name Me("Field" & cnt).ControlSource = fld.Name Next End Sub

  • Excel VBAでXML形式のデータを扱いたい

    SQL ServerにXML形式のデータが"1つのカラムにロングテキスト(ntext)形式で格納"されています。 このデータをExcelのVBAで取得したのは良いのですが、XML文書からタグを指定して任意の値を取得する方法がわかりません。 とりあえず以下のように普通の取得をするまでは書いてみました。 --- Sub GetXMLDataFromSQLServ() Dim CNN As ADODB.Connection Dim RST As ADODB.Recordset Dim RecCt As Long Dim strCNN As String Dim strData1 As String Dim strData2 As String Dim xmlTest As MSXML2.DOMDocument 'Connection String strCNN = "driver={SQL Server}; server=appdemo; uid=userid; pwd=password; database=database" Set CNN = New Connection CNN.ConnectionTimeout = 30 CNN.Open strCNN 'レコードセットを開く Set RST = New ADODB.Recordset RST.CursorType = adOpenStatic RST.Open "SELECT * FROM G_JOB_CONTENT;", strCNN RST.MoveFirst 'シートに出力 Do Until RST.EOF ActiveCell.Value = RST.Fields("JOB_ID") ActiveCell.Offset(0, 1).Value = RST.Fields("XML") '---(1) RST.MoveNext ' ActiveCell.Offset(1, 0).Activate Loop 'レコードセットを閉じる Set RST = Nothing '接続を閉じる Set CNN = Nothing End Sub --- (1)の部分でXMLのタグを指定し、任意のデータを得たいと考えています。 参照設定などを見て、おそらくMSXML2オブジェクトを使うのかな、というところまでは想像ついたのですけど・・・。 どなたかご教示の程をお願いいたします。

    • ベストアンサー
    • XML
  • ACCESSへの更新に関して

    以下のような記述をして、VBからACCESSのテーブルに書き込みを行おうとしています。 その際に、開発をしているVisual Basic2008のデバックモードでは、問題なくACCESSに 更新ができますが、コンパイルしてできあがった"EXE"から実行した場合、ACCESSへの更新ができません。 エラーが起こっているかと思い、updateのあるfor文にポップアップを出すような仕掛けを作り、試してみましが、 そこを通過するものの、エラーも何も起こらずに正常終了してしまいます。 何が原因でしょうか。。。教えて下さい。 環境  Windows7/ACCESS2000/VB2008/参照設定:Microsoft ActiveX Data Objects 2.8 Library   'データベースファイル名 Dim dname As String = "C:\test.mdb" 'データベースパラメータ Dim strDatbasePara As String Dim Cnn As New ADODB.Connection Dim Rst As New ADODB.Recordset strDatbasePara = "Provider=Microsoft.Jet.OLEDB.4.0;" + _ "Data Source=" + dname + ";" + _ "Jet OLEDB:Engine Type=5;" Try Cnn.Open(strDatbasePara) Rst.Open("table", Cnn, ADODB.CursorTypeEnum.adOpenDynamic, ADODB.LockTypeEnum.adLockOptimistic) If Rst.EOF Then For jcount = 0 To icount - 1 Rst.AddNew() Rst.Fields("項目1").Value = "AAA" Rst.Update() Next End If Rst.Close() Catch ex As Exception smsg = "失敗しました。" MessageBox.Show(smsg, "更新", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) End Try Cnn = Nothing Rst = Nothing

  • うまく処理されません(ACCESSのVBA)

    イベント事業を管理するデータベースを作っています。 メインのテーブルを表示するフォームから、チェック(Yes/No型)された項目だけを抽出したクエリ「記事抽出」があります。 ここから、「行事名」「会場」「月1」「日1」という各フィールドのデータを以下のコードのように変数に代入していきたいのです。 チェックした数が少ないときはうまくいくのですが、20個くらいチェックすると、ループの途中で抜けてしまいます。このとき、エラーメッセージは表示されません。 原因として考えられることがあればお教えください。 説明が不足しているようでしたら、補足のほうで説明したいと思いますのでよろしくお願いします。 Dim cnn As New ADODB.Connection Dim rst As New ADODB.Recordset Dim i As Integer Dim gyouji(50) As String '行事名 Dim kaijyou(50) As String '会場 Dim tuki1(50) As Integer '月1 Dim nichi1(50) As Integer '日1 Set cnn = CurrentProject.Connection i = 0 With rst    .Open "記事抽出", cnn, adOpenKeyset, adLockOptimistic, adCmdTableDirect    Do Until .EOF      gyouji(i) = !行事名      kaijyou(i) = !会場      If IsNull(!月1) Then        tuki1(i) = 0      Else        tuki1(i) = !月1      End If      If IsNull(!日1) Then        nichi1(i) = 0      Else        nichi1(i) = !日1      End If      .MoveNext      i = i + 1    Loop    .Close End With cnn.Close

  • 【MS ACCESS】 クエリの結果を文字列で書き出す事に悩んでいます。

    お世話になります。 選択クエリの結果を文字列として書き出したいので、いろいろ調べてみると 以下のコードを見つけました。 ======================== Dim cnn As New ADODB.Connection Dim rst As New ADODB.Recordset Dim strData As String Set cnn = CurrentProject.Connection With rst .Open "顧客マスタ", cnn, adOpenKeyset, adLockOptimistic, adCmdTableDirect strData = .GetString(adClipString, 10) Debug.Print strData .Close End With cnn.Close ================================== これはテーブルを文字列としてイミディエイトウィンドに書き出すものなのですが、これがテーブルだけしか使えず、難儀しております。変更しようにもなにぶん実力がないもので手が出ません。 どうぞ、選択クエリの結果を文字列として表示させる方法を教えてください。 お願いします。

  • VBAからaccessへの接続で、RecordsetのCursorTypeが勝手に変更される

    エクセルVBAからaccessへの接続で、RecordsetのCursorTypeが勝手に変更されてしまいます。 Dim rst As New ADODB.Recordset rst.CursorType = adOpenStatic と「adOpenStatic」に設定したいのですが、 Set rst = con.Execute(sql_str, , adCmdText) のようにクエリを実行した直後にCursorTypeを調べると、「adOpenForwardOnly」に変わってしまっています。 (設定直後に調べると、ちゃんとadOpenStaticになっています) 「CursorType」を何に設定しても、Execute直後に「adOpenForwardOnly」になってしまっていまうようです。 CursorTypeをadOpenStaticにして、RecordCountを使いたいのですが、、、 CursorTypeが変わってしまう原因をお知りの方は、教えていただけるとありがたいです。 Dim rst As New ADODB.Recordset Dim con As New ADODB.Connection con.Open "Provider=Microsoft.jet.OLEDB.4.0;" & "Data Source=" & ThisWorkbook.Path & "\" & mdb_file & ";" rst.CursorType = adOpenStatic rst.LockType = adLockReadOnly MsgBox "前 = " & rst.CursorType Set rst = con.Execute(sql_str, , adCmdText) MsgBox "後 = " & rst.CursorType

  • アクセス2000(ADO)のレコード更新について

    1件しかレコードがない[リスト連番T]テーブルのレコードを読みだして、(フィールド)リストNOをプラス1して更新したいです。 DOAが混ざっているのか、下記のようにエラーがでます。プラス1して更新する正しいプログラムを教えて下さい。 Private Sub リスト_Click() Dim DBS As Databasu Dim CNC As New ADODB.Connection Dim RST As New ADODB.Recordset Dim LISTNO As Intejer Set CNC = CurrentProject.Connection RST.Open "リスト連番T", CNC, adOpenKeyset,adLockOptimistic, adCmdTableDirect LISTNO = RST!リストNO RST.Close Set RST = Nothing CNC.Close Set CNC = Nothing Set DBS = CurrentDb Set RST = DBS.OpenRecordset("リスト連番T") With RST -----.Edit で コンパイルエラー-----   メソッドまたはデータメンバーがみつかりません .Edit !リストNO = LISTNO + 1 .Update .Close

  • アクセスVBA CSVへ出力後、最終レコードの次の行に任意の文字を入れたい

    VBA超初心者です。宜しくお願いします。 今回は、テーブルからエクセルへ出力後、最終レコードの次の行に任意の文字を入れたいというのがわからず質問です。 全体の流れとしては、エクセル起動→テーブル名1を出力→テーブル名2を出力→CSV形式で保存となります。 このテーブル名2を出力した際の処理についてです。以下の記述の中で、”★★テーブル名2を貼り付け”の処理を追加、変更などする形で考えたいのですが、よい方法はございませんでしょうか? 具体的には【テーブル名2をエクセルの任意の範囲に出力】→最終レコードの次行の特定の列を複数指定して任意の文字”END”を入れる。 (例:貼り付け開始がB25、データが3レコードであれば、28行目の任意の列(CとE)を指定して”END"といれる) なお、テーブル名2のレコード数は毎回ことなります。 説明不足の場合はご指摘ください。 御知恵を拝借したく宜しくお願いします。 --------------------------- Sub opnXLtmp3() On Error GoTo Err_opnXLtmp3 Dim cnn As ADODB.Connection Dim rst As ADODB.Recordset Dim cnn2 As ADODB.Connection Dim rst2 As ADODB.Recordset Dim stBasis As String Dim stDetail As String Dim xls As Excel.Application Dim wkb As Excel.Workbook Dim fName As Variant Dim stPath As String 'mdb & Excel Book Path Dim stXLName As String 'Book Name Dim stSheet As String 'Sheet Name Dim stRng As String 'Range Address stPath = CurrentProject.Path '自mdb & Excel Book のパス stXLName = "ファイル名.csv" 'テンプレート用の Book stBasis = "テーブル名1" 'テーブル名1 stDetail = "テーブル名2" 'テーブル名2 stSheet = "シート名" '出力するシート名 stRng = "B25" '出力開始セル番地 Set cnn = CurrentProject.Connection Set cnn2 = CurrentProject.Connection Set rst2 = cnn2.Execute(stBasis) Set rst = cnn.Execute(stDetail) 'テンプレート としてオープン Set xls = CreateObject("Excel.Application") xls.Workbooks.Add template:=stPath & stXLName Set wkb = xls.Workbooks(1)   'テーブル名1を貼り付け With wkb.Worksheets(stSheet) .Cells(3, 10) = rst2("番号") End With '★★テーブル名2を貼り付け With wkb.Worksheets(stSheet) .Range(stRng).CopyFromRecordset Data:=rst    'ここに .Cells(X, 3) = "END" じゃだめでした。    'ここに .Cells(X, 5) = "END" じゃだめでした。 End With 'Excel画面を表示して終了(保存しない) xls.Visible = True fName = xls.Application.GetSaveAsFilename("ファイル名3" & rst2("番号"), _ "CSVファイル(*.csv),*.csv", 1) If fName <> False Then wkb.SaveAs FileName:=fName MsgBox "新規ブックは、「" & fName & "」の名前で保存しました!", vbOKOnly Else MsgBox "新規ブックは保存できませんでした。", vbOKOnly End If End Sub