• ベストアンサー

ExcelのVBAでAccess操作です

タイトルの操作で、エクセルシートのセルのコード番号をアクセスの データベースのIDのフィールドから検索し、アクセスのその行を削除または、修正をしようとしています。 アクセスのIDのフィールドには重複するものは存在しません。 現在For~Nextで一行づつ見る方法まできましたが、レコード数が増えた場合かなりの時間がかかります。 エクセルのVBAの記述で TROW=検索範囲.Find(検索文字列,Lookat:=xlWhole).Row に換わる記述はどういうものがあるのでしょうか? エクセルのVBAで処理をしたいのですがよろしくお願いします。 また、For~Nextの記述の場合、変更しようとするとLockedがYesになっているため変更できない旨のメッセージが出ます。 アクセスのテーブルにロックがかかっている意味だと思うのですが、 Unprotectのような記述もあれば教えていただきたいと思います。 アクセスは全く初めてで壁にぶち当たっています。 どうぞ宜しくお願いします。

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

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

テーブル1で、IDが1,3,5,7,9のデータを削除するクエリは DELETE FROM テーブル1 WHERE ID In (1,3,5,7,9) テーブル1で、IDが1,3,5,7,9のデータのフィールド1を'ABC'に更新するクエリは UPDATE テーブル1 SET フィールド1 = 'ABC' WHERE ID In (1,3,5,7,9) A列のA1から行方向に対象IDがある場合(空白行まで)は、 Range(Range("A1"), Range("A1").End(xlDown)) が対象IDの範囲です。 この範囲の値をカンマ区切りの文字列にするには Join(Application.Transpose(Range(Range("A1"), Range("A1").End(xlDown))),",") で得られます。(Excel2000の場合は、Application.Transposeの最大範囲は5461個) ということで、A1から行方向に対象IDを用意してください。 更新クエリか削除クエリのどちらかを有効にしてください。 [ツール][参照設定]で[Microsoft ActiveX Data Objects 2.? Library]にチェックをしてください。 Sub sample() Dim cnn As New ADODB.Connection Dim id As String Dim sql As String id = Join(Application.Transpose(Range(Range("A1"), Range("A1").End(xlDown))), ",") 'sql = "DELETE FROM テーブル1 WHERE ID In (" & id & ")" '削除クエリ sql = "UPDATE テーブル1 SET フィールド1 = 'ABC' WHERE ID In (" & id & ")" '更新クエリ cnn.Provider = "Microsoft.Jet.OLEDB.4.0" cnn.Open "c:\db1.mdb" cnn.Execute sql cnn.Close Set cnn = Nothing End Sub

choro_jan
質問者

お礼

ありがとうございます。 今までエクセルのシートでデータベースを組んでいましたが、 アクセスへの接続がこんなにもスムーズだと初めて知り感激しております。 'sql = "DELETE FROM テーブル1 WHERE ID In (" & id & ")" '削除クエリ sql = "UPDATE テーブル1 SET フィールド1 = 'ABC' WHERE ID In (" & id & ")" '更新クエリ この部分が重要なんですね 挑戦してみたいと思います。 ありがとうございました。

その他の回答 (1)

  • Masa2072
  • ベストアンサー率51% (94/182)
回答No.1

ご希望の回答ではないかもしれませんが参考になれば。 ExcelのSheet1のA列にID,B列に処理種別、C列にフィールド名、D列にデータをそれぞれ入れたリストがあります。 100 | D |       | 201 | E | フィールド2 | ABC  ・  ・  ・  こんな感じで・・、B列の処理種別がDなら削除、EならC列の指定フィールドをD列のデータで変更するマクロが以下のサンプルです。 ※ ACCESSのファイルはC:\SAMPLE.MDB、テーブル名はTABLE1 Sub Sample()   Dim Cnn As New ADODB.Connection   Dim strSQL As String   Dim Siji As Object   Dim GYOU As Long   Dim ID As String   Dim SYORI As String   Dim FiledName As String   Dim NewData As String      'ACCESSデータベースへのADO接続   Cnn.ConnectionString = "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\sample.mdb"   Cnn.Open      For Each Siji In Sheets("Sheet1").Range("A:A")     If Siji.Value = "" Then       'A(ID)が空なら終了       Cnn.Close       Set Cnn = Nothing       Set Siji = Nothing       Exit Sub     End If     ID = Siji.Offset(0, 0)     SYORI = Siji.Offset(0, 1)     FiledName = Siji.Offset(0, 2)     NewData = Siji.Offset(0, 3)          Select Case SYORI     Case "D"  'レコードの削除       strSQL = "DELETE * FROM TABLE1 WHERE ID = '" & ID & "'"     Case "E"  'レコードの編集       strSQL = "UPDATE TABLE1 SET " & FiledName & " = '" & NewData & "' WHERE ID = '" & ID & "'"     Case Else       'D、E以外の場合はSQL文を発行しない       strSQL = ""     End Select          If strSQL <> "" Then       Cnn.Execute (strSQL)  'SQL文の実行     End If   Next      Cnn.Close   Set Cnn = Nothing   Set Siji = Nothing End Sub

choro_jan
質問者

お礼

ありがとうございます ID行を探しにいくのではなく、指定して削除、または編集ですね。     Case "D"  'レコードの削除       strSQL = "DELETE * FROM TABLE1 WHERE ID = '" & ID & "'"     Case "E"  'レコードの編集       strSQL = "UPDATE TABLE1 SET " & FiledName & " = '" & NewData & "' WHERE ID = '" & ID & "'" この部分を使ってチャレンジしたいと思います。

関連するQ&A

  • EXCELのVBAを用いたACCESSのデータベース操作の本について

    VBAの初心者です。 EXCELのシート上にあるデータをACCESSのデータベースに蓄積したり、ACCESSのデータベースからEXCELにデータを飛ばして加工したりしたいと考えています。できれば、ACCESSにVBAを記述するのではなく、EXCELにVBAを記述し、データの蓄積などをEXCELから行う方法を勉強したいのです。 自分が本屋で見た限りでは、ACCESSにVBAを記述する方法であれば様々な本が出版されているのですが、EXCELに記述する方法が書いてある本が見当たりません(たくさんあるのかも知れませんが)。皆様お勧めの分本を教えてください。 なお、自宅でEXCEL2000とACCESS2000、会社でEXCEL97とACCESS97を使っていますので、どちらでもいける本がいいです。 よろしくお願いします。

  • Excel VBA からの Access 呼び出しでの挙動不審

    ADO を使って、Excel VBA から Access のテーブルを検索しようとしています。 Excel, Access 共に 2000 です。 変数の説明:  myConn は、ADODB.Connection。  mySQL は、 String。 コード: mySQL = "INSERT INTO T1 (ID) SELECT ID FROM T2 WHERE Name like '*日本*'" myConn.Execute mySQL というコードで、テーブルT1 へテーブルT2 の ID フィールドのデータを転送しようとしています。検索条件として、テーブルT2 の Name フィールドを指定しています。  T2 のデータはきちんと入っており、実際この mySQL の文字列をそのまま Access のクエリに Copy & Paste して実行すると、うまく動きます。  具体的には、SELECT 以後をクエリに Copy & Paste してデータ表示すると、Name に「日本」を含むデータが表示されました。  しかし、Excel VBA のプログラムからでは、何もヒットしない結果となります。  Access クエリでの書式と、Excel VBA からコールするときの書式とは違うのでしょうか。  よろしくお願いします。

  • エクセルのVBAで悩んでいます。

    いつもありがとうございます。 エクセルのVBAで悩んでいます。 セルの範囲指定をVBAで行いたいのです。 ただし、引数に数値変数を使用する為、Cellsプロパティを使います。 すると、離れている範囲の範囲指定が出来ないのです。 例えば、Rangeプロパティだと、 Range("A5:E5,A9:E32").Select こうなるところを、 A9:E32 を変数に置き換えたくて、 Range("A5:E5", Cells(g, 1), Cells(h, 5)).Select と、するとエラーが出ます。 VBAの前文は次の通りです。 Private Sub CommandButton1_Click() a = Me.TextBox1.Value b = Me.TextBox2.Value Set c = Range("a:a").Find(what:=a, LookIn:=xlValues, lookat:=xlWhole) Set d = Range("a:a").Find(what:=b, LookIn:=xlValues, lookat:=xlWhole) 'MsgBox c + d e = c.Address 'MsgBox e f = d.Address 'MsgBox f g = Range(e).Row MsgBox g h = Range(f).Row MsgBox h Range(Cells(g, 1), Cells(h, 5)).Select End sub よろしくお願い致します。

  • エクセルVBAでアクセスファイルを開く方法

    いろいろ検索してコピペ等でやってみてもだめでした。 エクセルVBAで、エクセルファイルやEXEファイルを開く方法は簡単なのに、 アクセスファイルの開き方がわかりません。 ただ開くだけなのですが、簡単な記述の仕方はありませんか?

  • エクセルからアクセスDBを操作する

    エクセルVBAでアクセスのDBへ接続しそこから選択項目をエクセル側に引っ張ろうとしています。 エクセルVBAの場合、マクロの記憶で分からない操作を記録して、そのままVBAに使う事が出来ますが、アクセスにも似たような機能はありますか? 普段アクセスではクエリで検索条件を指定していますが、このクエリの検索条件をエクセルのマクロの記憶みたいな形でコードとして出す事は出来ないでしょうか? エクセルVBAでアクセスでの検索条件を組み込みたいのです。

  • EXCEL VBAでマクロの最後でFind関数のLookAtの設定を変更したい。

    EXCEL VBAでマクロの最後でFind関数のLookAtの設定を変更したい。 EXCELの検索機能において、通常は、オプションの「セル内容が完全に同一であるものを検索する」のチェックを外して使用しています。 あるマクロにおいて、Find関数のLookAtの値を「xlWhole」(完全一致)で使用しています。 この「LookAt」の値は、通常の手動での検索にも設定が引き継がれるため、このマクロの後に、検索機能を使用するとオプションの「セル内容が完全に同一であるものを検索する」はチェックされた状態になっています。 つまり、通常時はあいまい検索、マクロ時は完全一致検索を行いたいと思っており、マクロの最後で、あいまい検索に設定を変更しておきたいのですが、そういった指定は可能なのでしょうか。 ごり押しですが、最後に、あいまい検索で適当な検索を行っておくという事も考えましたが、もう少しスマートな方法があるのか、ご存知の方がいらっしゃればと思い質問させていただきました。 よろしくお願いします。

  • エクセルVBAで解らない部分があります。

    エクセルVBAで解らない部分があるのでどなたか教えてください。 ある表から特定の日付を探して抜き出すVBAを組み込んだファイルに下記のような記述がありました。 y=1:i=1 do   set tmp=workbooks("B").sheets(1).rows(2).find(workbooks("A").sheets(1).cells(y,1),lookat:=xlwhole)   if not tmp is nothing then     Workbooks("B").sheets(2).cells(i,1)=workbooks("A").sheets(1).cells(y,1)     '~略~     i=i+1   end if   y=y+1 loop until y=workbooks("A").sheets(1).range("A65536").end(xlup).row この中の「y=1:i=1」がよくわかりません。どなたか解る方どういう意味か教えてくれませんか? よろしくお願いします。

  • EXCEL VBAのFind について

    VBAで、特定の文字が入っているセル位置(結合セル)を取得したく、 シートのコード記述で --- Private Sub Worksheet_Change(ByVal Target As Range) Dim w_CelObj As Object Set w_CelObj = ActiveSheet.Cells.Find(What:="あああ", LookAt:=xlWhole, MatchByte:=False) MsgBox w_CelObj.Row MsgBox Cells.Find(What:="いいい").Row End Sub ----- と記述し、"aa"も"bb"もどちらの方法でも取得できました。 ですが、これを別のEXCELブック(既にシートがたくさんあり、コードもびっしり記述してあります)で同様のことを行おうとするとエラーになってしまいます。 ※新しいシートを作成し、そのシートにコードをコピーして試しました。 セルの結合を解除すると正常に取得できるのですが、結合セルだとFindされてきません。 調べてみましたが、「Cells.Find」ときちんとセル全体を指定していれば大丈夫のようで、同様の事例を検索できませんでした。 他に何を調べればよいでしょうか? ご協力よろしくお願いします。

  • ExcelのVBA ListBox.RowSourceの範囲について教えてください。

    下記のように範囲を変数で検索指定したいのですが、うまくいきません。VBAは初心者です。誰か助けて。 内容は・・・五十音順にあるリストを作り、ウ音のみをListBoxに表示したいのですが。 Private Sub ToggleButton3_Click() Dim A As Range Dim BBB As String Dim C As Range Dim DDD As String Set A = Cells.Find(what:="ウ", lookat:=xlWhole) BBB = Cells(A.row, A.Column + 1).Address Set C = Cells.Find(what:="エ", lookat:=xlWhole) DDD = Cells(C.row - 1, C.Column + 1).Address ListBox商品名.RowSource = "BBB:DDD" End Sub PS 違う方法でもいいのでどなたか教えてください。

  • vba(Access2003)の記述情報

    こんばんは。 遅くに質問失礼します。 只今、Access2003のvbaを記述しており、エラーが出て困りましたので質問いたしました。 初歩的な事かと思うのですがご指導下さいませ。 AccessのフォームにテキストボックスA、テキストボックスB、テキストボックスC、作成し、フォームロード時に編集ロックをしたいと思います。 ※------------------------------ Me.AllowEdits = False とか プロパティの編集ロック はい/いいえ を利用しない方法を探しています。 -------------------------------- 現在vbaの記述は Private Sub Form_Load()  Dim Tbox As Variant  Tbox = Array("テキストボックスA", "テキストボックスB", "テキストボックスC")  Dim i As Integer  For i = LBound(Tbox) To UBound(Tbox)   [Tbox(i)].Locked = True ★  Next i End Sub を記述すると★行にエラーが発生します。 勉強のため色々ためしてみました。 試(1)…For文を外し短文で [テキストボックスA].Locked = True とした場合には問題なくロックできました。 試(2)…For文を外し短文で [Tbox(0)].Locked = True とした場合にはエラー。 試(3)…変数内確認のため MsgBox Tbox(0) とした場合「テキストボックスA」と出ます。 試(4)…For文を外し短文で [ & Tbox(0) & ].Locked = True や [ + Tbox(0) + ].Locked = True 試しましたがエラー・・・(当たり前でしょうが、、、 試(5)…googleで『vba [] 文字列 結合』等色々調べましたがあまり良い例に辿り着けず、、、 ご教授いただければ幸いです。 何卒、宜しくお願い致します。

専門家に質問してみよう