- ベストアンサー
【access】表の値を別項目にセットする方法
- access2010を使用して、TBLの編集を行いたい場合、表の特定の項目にあるカンマ区切りの文字列を、他の項目にセットする方法が知りたいです。
- 具体的には、TBL1のM1という項目にカンマ区切りの文字列がある場合、それをカンマで区切ってTBL1のM2~M4に順番にセットしたいです。
- VBAでプログラムを組んでもうまくいかないので、より効率的かつスマートな方法があれば教えていただきたいです。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
標準モジュールに以下を貼り付け実行してください。 なお、DAOを使っているので参照設定で Microsoft DAO xxx Object Library にチェックが入っているか確認してください。 一応、テーブルのフィールド数はカンマ切り のデータの最大数ほどは確保されているものと します。 各レコードのカンマの数が違っていてもフィールドの 最大数が確保されていれば問題ありません。 もし、Keyフィールドのデータのカンマの数の最大数が不明で あるような場合はまた別の方法をとるようになります。 Sub test1() Dim db As DAO.Database Dim rs As DAO.Recordset Dim buf As Variant Dim i As Integer Set db = CurrentDb Set rs = db.OpenRecordset("TBL1", dbOpenDynaset) If rs.RecordCount > 0 Then rs.MoveFirst Do Until rs.EOF 'テーブルのKeyフィールドのデータを配列に格納 buf = Split(rs!Key, ",", , vbTextCompare) '格納した配列のデータを各フィールドに格納 For i = 0 To UBound(buf) rs.Edit rs(i + 1) = buf(i) rs.Update Next i rs.MoveNext buf = "" Loop End If rs.Close: Set rs = Nothing db.Close: Set db = Nothing End Sub
その他の回答 (6)
- chayamati
- ベストアンサー率41% (260/624)
1.テーブルのレコードをテキスト形式でエキスポート 2.テキストファイル開き、” (ダブルコーテーション)を除去してカンマ区切りにする 3.カンマ区切りのテキストファイルをACCESSへインポート ”除去はメモ帳でも可能ですが、処理できる容量が限られています。 文字列ファイルのみ処理するテキストエディタが必要でしょう 自分はFreeのTeraPadを使っています。
- 参考URL:
- https://terapad.softonic.jp/
- piroin654
- ベストアンサー率75% (692/917)
すみません。あわてもので。No5の >No3の変なところの訂正です。 は、 No4の変なところの訂正です。 です。No3の方も含めてごめんなさい。
- piroin654
- ベストアンサー率75% (692/917)
No3の変なところの訂正です。 >No2です。もしKeフィールドのyデータの中に は、 No2です。もしKeyフィールドのデータの中に です。枕の一文の文字の確定が変になっていました。
- piroin654
- ベストアンサー率75% (692/917)
No2です。もしKeフィールドのyデータの中に A,,C,D のように空文字が入っているような場合、 該当するフィールドには何も入れずに次に データは次のフィールドに格納するということが あるならば、 Sub test1() Dim db As DAO.Database Dim rs As DAO.Recordset Dim buf As Variant Dim i As Integer Set db = CurrentDb Set rs = db.OpenRecordset("TBL1", dbOpenDynaset) If rs.RecordCount > 0 Then rs.MoveFirst Do Until rs.EOF 'テーブルのKeyフィールドのデータを配列に格納 buf = Split(rs!Key, ",", , vbTextCompare) '格納した配列のデータを各フィールドに格納 For i = 0 To UBound(buf) If buf(i) <> "" Then rs.Edit rs(i + 1) = buf(i) rs.Update End If Next i rs.MoveNext buf = "" Loop End If rs.Close: Set rs = Nothing db.Close: Set db = Nothing End Sub のように、 If buf(i) <> "" Then End If を入れておきます。 ほかにKeyフィールドの文字列の構造に何かあるのならば 補足してください。
私はクリエで実現することを考えてみました。 ただ、元のデータは3つの文字列がカンマで区切られていることが前提条件です。 SQL画面でこれを張り付けてください。 SELECT [TBL1].M1, Left([M1],[Location1]-1) AS M2, Mid([M1],[Location1]+1,[Location2]-[Location1]-1) AS M3, Mid([M1],[Location2]+1) AS M4, InStr([M1],",") AS Location1, InStr([Location1]+1,[M1],",") AS Location2 FROM TBL1; これのクエリの結果をコピー&ペーストしてTBL1に張り付けてもいいし、このクエリを更新クエリにしてもいいし、それはお好み次第です。 なおこのクエリでやっていることは、まずカンマの位置を調べて、そのカンマの位置で元の文字列をぶつ切りにしているだけです。
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
Q、良い方法は無いでしょうか? A、イミディエイトウインドウでSQL文を実行する。 添付図では、M2のみをUPDATEしています。が、M3、M4も同じやり方でOKですよ。 M3=CutSTr(M1, "","", 2)") M4=CutSTr(M1, "","", 3)") なお、CnnExecute()を利用するかどうかは好みの問題です。 Public Function CnnExecute(ByVal strSQL As String) As Boolean On Error GoTo Err_CnnExecute Dim isOK As Boolean Dim cnn As ADODB.Connection isOK = True Set cnn = CurrentProject.Connection With cnn .Errors.Clear .BeginTrans .Execute strSQL .CommitTrans End With Exit_CnnExecute: On Error Resume Next cnn.Close Set cnn = Nothing CnnExecute = isOK Exit Function Err_CnnExecute: isOK = False If cnn.Errors.Count > 0 Then ErrMessage cnn.Errors(0), strSQL cnn.RollbackTrans Else MsgBox "プログラムエラーが発生しました。" & _ "システム管理者に報告して下さい。(CnnExecute)", _ vbExclamation, " 関数エラーメッセージ" End If Resume Exit_CnnExecute End Function Public Sub ErrMessage(ByVal CnnErrors As ADODB.Error, ByVal strSQL As String) MsgBox "ADOエラーが発生しましたので処理をキャンセルします。" & Chr$(13) & Chr$(13) & _ "・Err.Description=" & CnnErrors.Description & Chr$(13) & _ "・Err.Number=" & CnnErrors.Number & Chr$(13) & _ "・SQL State=" & CnnErrors.SQLState & Chr$(13) & _ "・SQL Text=" & strSQL, _ vbExclamation, " ADO関数エラーメッセージ" End Sub Public Function CutStr(ByVal Text As String, _ ByVal Separator As String, _ ByVal N As Integer) As String Dim strDatas() As String strDatas = Split("" & Separator & Text, Separator, , 0) CutStr = strDatas(N * Abs(N <= UBound(strDatas))) End Function