文字列を連結し、1つの変数として定義する方法

このQ&Aのポイント
  • テーブル(tbl_Option)に先ほどのデータを変数として更新クエリとして処理を行いたい
  • 文字列の連結後を1つの変数とした場合の定義の仕方がわからない
  • OpDate1、OpDate2・・・というように変数にデータを割り当てていたとき、sql2の中で変数を参照する方法
回答を見る
  • ベストアンサー

文字列を連結した後に1つの変数として定義したい

OpDate1、OpDate2・・・というように変数にデータを割り当てていたとき、テーブル(tbl_Option)に先ほどのデータを変数として更新クエリとして処理を行いたいのですが、文字列の連結後を1つの変数とした場合の定義の仕方がわかりません。ご教授をお願いします。 OpDate1 = #10/10/2013# OpDate2 = #11/10/2013# OpDate3 = #12/10/2013# Set DBH = CurrentDb() sql = " SELECT tbl_Option.* FROM tbl_Option;" Set rs = DBH.OpenRecordset(sql) If rs.RecordCount <> 0 Then rs.MoveLast rs.MoveFirst For iintLoop = 1 To rs.RecordCount With rs Set DBH2 = CurrentDb() →→ sql2 = " UPDATE tbl_Option SET tbl_Option.試用期限 = #" & "OpDate" & iintLoop & "#" _ & " WHERE (((tbl_Option.処理番号)=" & iintLoop & "));" DBH2.Execute sql2 .MoveNext End With Next iintLoop End If

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

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.1

雰囲気、以下の様な処理ではダメでしょうか 「処理番号」が、1 ~ レコード数 以内であれば、 2013/9/10 を起点にして、何ヶ月(処理番号)加算した日付を設定する Dim iLast as Long Set DBH = CurrentDb() sql = " SELECT tbl_Option.* FROM tbl_Option;" Set rs = DBH.OpenRecordset(sql) If(Not rs.EOF) Then   rs.MoveLast   iLast = rs.RecordCount   rs.MoveFirst End If While(Not rs.EOF)   If((rs("処理番号") >= 1) And (rs("処理番号") <= iLast)) Then     rs.Edit     rs("試用期限") = DateAdd("m", rs("処理番号"), #9/10/2013#)     rs.Update   End If   rs.MoveNext Wend ・・・ 提示された物でやろうとしたら、個々の変数名を定義するのではなく Dim OpDate(1 to 100) As Date とか持っておいて OpDate(1) = #10/10/2013# OpDate(2) = #11/10/2013# OpDate(3) = #12/10/2013# とかして " UPDATE tbl_Option SET tbl_Option.試用期限 = #" & "OpDate" & iintLoop & "#" _ ↓ " UPDATE tbl_Option SET tbl_Option.試用期限 = #" & OpDate(iintLoop) & "#" _ ただ、レコード数分事前に配列を用意する必要がありますけど また、For 内では rs を参照していない様なので閉じておいてもよいのでは、と。 どうしても変数名で別々にしたいのであれば、他の方の回答を待ってください。 また、上記はなかった事にしてください。 なお、上記記述はメモ帳に直接書いているので、動かなかったらごめんなさい。

csccomet
質問者

お礼

有難うございます。なるほどと思いました。早速対応してみたいと思います。

関連するQ&A

  • ADOでレコードを閉じるタイミング。。Access2000/VB6/Win2K

    レコードセットを返すFuncitonプロシージャーを作ってみたのですが。。。 下のGet_Recordsの方のレコードセットをCloseすると上の方のDisp_Dataでオブ ジェクトが閉じているといって怒られます。しかし、閉じないと下の方では開きっ ぱなしになると思うのですが。。。どのように処理すればいいのでしょうか? Public P_CN As ADODB.Connection Private Sub Disp_Date()   Dim RS As ADODB.Recordset   Dim SQL AS String    Set RS = Get_Records(SQL)     With RS      If .RecordCount > 0 Then       .MoveLast: .MoveFirst       .Debug.Print !顧客_ID        End If      End With      RS.Close     Set RS = Nothing End Sub Public Function Get_Records(pSQL As String) As ADODB.Recordset   Dim RS As ADODB.Recordset     Set RS = New ADODB.Recordset      RS.Open pSQL, P_CN, adOpenKeyset, adLockOptimistic     Set Get_Records = RS '''    RS.Close '''   Set RS = Nothing End Function

  • データ件数の表示について

    はじめまして、TXTFILEをACCESS97のテーブルにインポート定義で読み込んで 目的の文字列がフィールドにあったらMSGBOXで表示させたいのですがうまくいきません。 そのコードを試したところ他の文字列の分も表示されてしまいます。 そのコードを記入したので、その原因を教えてください。お願いします。 Private Sub Cmd_KensuuHyouji_Click() Dim i As Long Set G_CurrentDB = CurrentDb() Set Rs = G_CurrentDB.OpenRecordset("Table") '変数を空白にする GetFileName = "" 'フォームのTextBoxにフォーカスを移す Text1.SetFocus 'エラー回避 If IsNull(Text1.Text) Or (Text1.Text) = "" Then MsgBox "ファイルを選択してからクリックしてください", vbOKOnly + vbCritical Exit Sub End If 'ファイル名の左12桁が目的のファイル名なら変数にファイル名をセット If Left$(Text1.Text, 12) = "1013405_0502" Then 'GetFileName変数にText1の値をセット    GetFileName = Text1.Text End If 'ファイルをテキストファイルとしてコピーする FileCopy PathName & GetFileName, PCstPath & "MSCT.TXT" 'テキストファイルをMSACCESS97にインポートする DoCmd.TransferText acImportDelim, "インポート定義", _ "Table", PCstPath & "MSCT.TXT", True 'インポート後レコードセットを最初の行へ戻す、でないと、件数0件で表示される Rs.MoveFirst Do Until Rs.EOF If Rs.Fields("発注者コード").Value = "1013405" Then i = Rs.RecordCount End If Rs.MoveNext Loop MsgBox "データ件数は" & Space$(1) & i & Space$(1) & "件です" Rs.Close G_CurrentDB.Close Set Rs = Nothing Set G_CurrentDB = Nothing End Sub

  • SQLSERVERからデータを取得する方法

    SQLSERVERに商品テーブルを作り ACCESSにローカルテーブル(下記の例では入力テーブル)を 作りました。 ACCESS VBAで ACCESSのローカルテーブルを1件ずつ読み SQLSERVERの商品テーブルを検索したいのですが 下記の例 どちらが処理スピードが速いのですか? なお下記以外にも処理スピードが速い方法が あったら教えてください。 ●例1 Dim db As DATABASE Dim rs As Recordset   dim rt as Recordset Set db = CurrentDb Set rt = db.OpenRecordset("入力テーブル", dbOpenDynaset) sql = "SELECT 商品名 FROM 商品テーブル " sql = sql & "where 商品ID = '" & rt![商品ID] & "'" Set rs = db.OpenRecordset(sql) If rs.RecordCount = 0 Then MsgBox "NG" Else MsgBox rs![商品名] End If ●例2 Dim db As DATABASE Dim rs As Recordset   dim rt as Recordset Set db = CurrentDb Set rt = db.OpenRecordset("入力テーブル", dbOpenDynaset) Set rs = db.OpenRecordset("商品テーブル", dbOpenDynaset) rs.FindFirst "商品CD = '" & rt![商品CD] & "'" If rs.NoMatch Then MsgBox "NG" Else MsgBox rs![商品名] End If よろしくお願いします。

  • ACCESSの SELECT SUM

    SELECT SUMを 計算させると ゼロしか 出てきません。 どこが悪いのでしょうか?  日付         出金       氏名 2012/12/10      540      安田 2012/12/10      1020      斉藤 2012/12/10       970      TOM 2012/12/11      650      池田  2012/12/11     2010      南 2012/12/12      350      林田 2012/12/12     1200      加藤 のようなテーブルがあり Private Sub コマンド_click() Dim Db As Database Dim SQL As String Dim rs As Recordset Dim gokei As Long Set Db = CurrentDb SQL = "SELECT Sum(出金) as gokei FROM テーブル  WHERE 日付= #" & [Forms]![フォームアルファ]![テキスト] & "# " Set rs = Db.OpenRecordset(SQL) MsgBox gokei End Sub を フォームアルファに 新しく作ったコマンドボタンのクリック時に 書きました。 これを テキストの日付を変えておいて いろいろ試しても ゼロのメッセージしか出ません。 WHERE以下が 間違っていないか 試しに Private Sub コマンド_click() Dim Db As Database Dim SQL As String Dim rs As Recordset Dim Count As Long Set Db = CurrentDb SQL = "SELECT (出金)  FROM テーブル  WHERE 日付= #" & [Forms]![フォームアルファ]![テキスト] & "# " Set rs = Db.OpenRecordset(SQL) If rs.EOF Then Count = 0 Else rs.MoveLast Count = rs.RecordCount End If MsgBox Count End Sub を 実行すると ちゃんと 正しいレコード数が 表示されます。 「出金」のデータ型は 長整数になっています。 どこが 悪いのでしょうか? 目的は 指定した日付の 出金の合計を取り出したいのです。 . . .

  • ADO フィルタ 変数

    Sub test() Dim 月 As Long cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & CurrentProject.FullName rs.Open "Tテーブル", cn, adOpenStatic, adLockPessimistic 月 = 5 rs.Filter = " 処理日 = '" & #"& 月 &"/29/2009# & "'" MsgBox rs.RecordCount Set rs = Nothing Set cn = Nothing End Sub のように月に変数を入れ、フィルタをかけたいのですが 上記のコードでエラーになってしまいます。 アドバイスよろしくお願いします。

  • 削除クエリについて

    ACCESS2000で開発しています。 現在LOOPで A_TBL と B_TBL を日付とコードでリンクさせ同じデータがあれば削除するという処理をしています。 件数が多いためこれでは時間がかかるため、一括で削除できる削除クエリができないかと考えています。 どなたかご教授お願いします。 <現在のプログラム> SQL="SELECT 年月, コード, 日付 FROM A_TBL AS A INNER JOIN B_TBL AS B ON (A.日付 = B.日付) AND (A.コード = B.コード) WHERE (A.年月='200707')" Set RS = CurrentDb.OpenRecordset(SQL, dbOpenSnapshot) Do While Not RS.EOF SQL= "DELETE * FROM A_TBL WHERE (年月='200707') AND (コード='" & RS!コード & "') AND (日付='" & RS!日付 & "')" CurrentDb.Execute SQL RS.MoveNext Loop RS.Close Set RS = Nothing

  • Accessのテーブル取り込み付いて

    お世話になります。 Access2000のVBAで、テーブルの取り込み処理に ついて教えて下さい。 下記のようなソースで、ACCESSのテーブルを取り込み →エクセルに書き出しをしているのですが、 (1)の箇所で取り込み処理の時間が大量にかかっていることが わかりました。 処理速度が速くなるような、別のコーディングがあるのでしたら 教えて頂きたいので宜しくお願いします。 ----------ソース-------------------------- --------(1)--------------- With CurrentDb.QueryDefs(テーブル) .Parameters("[ID]") = "1111" Set rs = .OpenRecordset End With --------(1)--------------- If (Not rs.EOF) Then oApp.Sheets(1).cells(count, i + 1) = rs(i).Name oApp.Sheets(1).cells(count + 1, 1).CopyFromRecordset rs End If rs.Close Set rs = Nothing db.Close -----------------------------------------

  • 変数の宣言

    mdb内でsql文を使って、DeleteしたりInsertしたりしたいんですが、 Set 変数=CurrentDB の変数の宣言文は、どう書いたら良いのでしょう(?_?) どなたか、Help Me!!

  • DBの読み込み順について

    VBAでACCESSのテーブルを順番に読んでいきたいのですが、 読み込みの順番が、実際に入っているデータと異なっていてばらばらです。 先頭から順番に読んでいきたいのですが、どうしたらよいのでしょうか。 Public Function DateCheck() On Error GoTo ErrExit Dim db As Database Dim rs As Recordset Set db = CurrentDb() With Application.CurrentDb Set rs = .OpenRecordset("テーブル名", dbOpenSnapshot) rs.MoveFirst Debug.Print rs!STAFFCD Do Until rs.EOF Debug.Print rs!STAFFCD rs.MoveNext Loop rs.Close db.Close End With Exit Function ErrExit:

  • グループ毎にある列の最大値のレコードを取得する方法

    Accessで下記のようなテーブルでkeyフィールド毎のdayフィールドの最大値のレコードを取得したいと思ったのですが、keyフィールドとdayフィールドのみを表示する分には下記の記述で大丈夫かと思ったのですが、これにidフィールドとfieldフィールドもあわせて表示したい場合、どのように記述すれば良いか分からなかった為、アドバイスいただける方がいらっしゃいましたら、ご教示の程よろしくお願いします。 なお、出来れば同じkey,同じdayが複数あった場合、一番大きいid(主キー)のレコードを取得したいと思っています。 【テーブル(T_TBL)】 id|key|day|field ------------------ 1|1|     |100 2|2|2011/03/04|400 3|2|2011/03/03|500 4|3|2011/03/10|300 5|3|2011/03/10|200 【下記ソース実行時のメッセージボックスの表示結果】 1 : 2 : 2011/03/04 3 : 2011/03/10 【希望する表示結果】 1 : 1 : : 100 2 : 2 : 2011/03/04 : 400 5 : 3 : 2011/03/10 : 200 【ソース】 Option Compare Database Option Explicit Private Sub Form_Load() Dim db As DAO.Database Dim rs As DAO.Recordset Dim SQL As String Dim strMsg As String Set db = CurrentDb() SQL = "" SQL = SQL & "SELECT key, Max(day) AS max_day" SQL = SQL & " FROM T_TBL" SQL = SQL & " GROUP BY key" Set rs = db.OpenRecordset(SQL) Do Until rs.EOF strMsg = strMsg & vbNewLine & rs!Key & " : " & rs!max_day rs.MoveNext Loop MsgBox vbNewLine & strMsg rs.Close: Set rs = Nothing db.Close: Set db = Nothing End Sub 以上、よろしくお願いします。

専門家に質問してみよう