質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

1609閲覧

VBA 簡易に繰り返し処理が書きたい。

fffu8

総合スコア37

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/03/30 01:45

編集2020/03/30 02:35

DBに接続して、ExcelにDBの情報をExcelに全件表示させて、Excelから一部書き換えて書き換えた所のみ、DBに書き込みしたいのですが、いちよプログラムは動くのですが、ループ(繰り返し)処理が更新するたび動くようにコードを書いてしまって、一回で書くことができません。色々考えたのですが進めないのでご質問させて頂きました。お手数をおかけしますが、アドバイスよろしくお願い致します。

VBA

1'接続文字列 2Const CONNECTION = "DRIVER={Microsoft ODBC for Oracle};CONNECTSTRING=XE;UID=system;PWD=systemsss;" 3 4'指定した場所のみ更新 5Sub Button3_Click() 6 7 Dim oraCon As New ADODB.CONNECTION 8 Dim oraCmd As New ADODB.Command 9 Dim strSQL As String 10 Dim i As Integer 11 Dim j As Integer 12 Dim oraRs As New ADODB.Recordset 13 Dim n As Integer 14 15 oraCon.ConnectionString = CONNECTION 16 oraCon.Open 17 18 'SQLを作成 19 strSQL = "SELECT * FROM 社員テーブル1 ORDER BY 社員NO ASC" 20 21 'レコードセットにSQL実行し結果をセット 22 oraRs.CursorLocation = adUseClient 23 oraRs.CursorType = adOpenDynamic 24 oraRs.Open strSQL, oraCon 25 26 ReDim arrRcd(oraRs.Fields.Count, oraRs.RecordCount) 27 arrRcd = oraRs.GetRows 28 29 30 31 '最終行までの処理 32 n = Cells(Rows.Count, "A").End(xlUp).row 33 34 35For j = 1 To n 36 For i = 1 To 3 37 38 If Cells(j, i + 1).Value <> arrRcd(i, j - 1) Then 39 40 strSQL = "update 社員テーブル1 set " _ 41 + " 名前 ='" + Cells(j, 2).Value + "'" _ 42 + ",住所 ='" + Cells(j, 3).Value + "'" _ 43 + ",電話 ='" + Cells(j, 4).Value + "'" _ 44 + " where 社員NO = '" + CStr(j) + "'" 45 46 With oraCmd 47 .ActiveConnection = oraCon 48 .CommandText = strSQL 49 .Execute 50 End With 51 52 End If 53 54 Next i 55 Next j 56 57 Set oraCmd = Nothing 58 oraCon.Close 59 Set oraCon = Nothing 60 61End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hatena19

2020/03/30 02:14

コードはマークダウン書式のコードブロック内に記述してください。そうするとコードが読みやすくなり回答が付きやすいです。 下記のような記述になります。 ```vba ここにコードを記述 ``` あるいは、コード部分を選択して、ツールバーの<code>ボタンをクリックしてもOKです。
fffu8

2020/03/30 02:27

ご丁寧にありがとうございます。解答がついたら幸いです。
hatena19

2020/03/30 02:29 編集

編集していただいたようですが、まだ、マークダウン書式が適用されてません。 他の質問スレッドのコード部分をみてください。読みやすく色付けされています。 そうなるようにプレビューを見ながらトライしてみてください。
hatena19

2020/03/30 02:29

うまくできたようですね。ありがとうございました。
fffu8

2020/03/30 02:30

ありがとうございます。
guest

回答1

0

ベストアンサー

1件ずつ更新クエリを実行するより、
レコードセットを開いているのなら、レコードセットで直接更新したほうがはやいと思います。

エクセルの方は、セル範囲を配列に格納してそれとレコードセットのレコードと比較するようにすると高速化できます。

下記のコードはイメージですのて実際には動作しませんが、ロジックを参考にコードを修正してみください。

vba

1Dim aty() As Variant 2ary = Range(データ開始セル,データ終了セル).Value 3 4i=0 5Do until oraRs.EOF '最終レコードまでループ 6 If ary(i, 0).Value <> oraRs!名前.Value Or 7 ary (i, 1).Value <> oraRs!住所.Value Or 8 ary (i, 2).Value <> oraRs!電話.Value Then 9 oraRs!名前.Value = ary(i, 0).Value 10 oraRs!住所.Value = ary(i, 1).Value 11 oraRs!電話.Value = ary(i, 2).Value 12 oraRs.Update 13 End If 14 i = i+1 15 oraRs.MoveNext 16Loop

投稿2020/03/30 02:49

編集2020/03/30 02:56
hatena19

総合スコア34075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fffu8

2020/03/30 05:08

解答ありがとうございます。 すみません、ロジックを参考にしたのですが、 作り方があまりまだ理解できません。 差し支えなけらば、実際に動くコードを作成して頂くことは可能でしょうか?
hatena19

2020/03/30 05:26 編集

それは無理です。オラクルの環境もありませんし、同じ環境を揃えられるわけでもないので。 ロジック的には難しいところはなくレコードセットの使い方の基本ですし、エクセルで配列を使った高速化も検索すれば解説ページはいろいろ見つかりますので、それを研究してできるところまで自分で作成してみてください。そのうえでできたコードを提示して、ここがうまくいかないとか、エラーがでるとか具体的に質問してください。
fffu8

2020/03/30 05:24

ありがとうございます。 承知致しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問