• 締切済み

VBA where複数条件

Oracle12c office2016 oracleのデータをEXCELのマクロで更新するのにシリアル等の1つしかない条件だと次の内容で更新できます。マクロは抜粋です。 C列(ActiveSheet.Cells(row, 3))の内容がシリアルだと、下記でkomoku1,komoku2が更新可能。 With cmd .CommandText = "UPDATE table1" & " set komoku1 = '" & ActiveSheet.Cells(row, 6) & "' " & ", komoku2 = '" & ActiveSheet.Cells(row, 58) & "' WHERE " & " joken1 = '" & ActiveSheet.Cells(row, 3) & "'" .CommandType = adCmdUnknown .Execute End With 違うテーブルで条件を2つにして設定する場合 ActiveSheet.Cells(row, 3) と ActiveSheet.Cells(row, 4)のAND条件で設定する場合は、どの様な書式になるか教えていただきたく。 ActiveSheet.Cells(row, 3) と ActiveSheet.Cells(row, 4)は両方とも文字列です

みんなの回答

  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.4

>UPDATE table1 >set komoku1 = 'ABC', >set komoku2 = 'DEF' >WHERE (( joken1 = 'GHI') and (joken2 = 'JKL')) >の通りであっているのですが あっているにも関わらず、 書き換えが行われないのであれば、 >WHERE (( joken1 = 'GHI') and (joken2 = 'JKL')) この条件を満たすレコードがないということです。 言い換えれば joken1 の列が 'GHI' かつ、 joken2 の列が 'JKL' のレコード がないということです。 書き換える条件を joken1 の列が 'GHI' かつ、 joken2 の列が 'JKL' のレコードなら set komoku1 列に 'ABC' set komoku2 列に 'DEF' を書き込みなさい。 といった書き方で具体的に説明してみてください。

3620313
質問者

お礼

回答ありがとうございます。

3620313
質問者

補足

WHERE (( joken1 = 'GHI') and (joken2 = 'JKL')) この条件を満たすレコードがないことはありません。 joken1とjoken2のAND条件で更新されないので、それぞれ単独でやってみました。 'joken1 = 3620313 でkomoku1を15へ更新 With ActiveSheet sql = "" sql = sql & "UPDATE table1" & vbCrLf sql = sql & "set komoku1 = " & "'" & .Cells(row, 6).Value & "'" sql = sql & "WHERE (" & " joken1 = '" & .Cells(row, 3).Value & "') " End With '結果OK komoku1 15へ更新される 'joken1 = 3620313 でkomoku2を20200717103000へ更新 ' With ActiveSheet sql = "" sql = sql & "UPDATE table1" & vbCrLf sql = sql & "set komoku2 = " & "'" & .Cells(row, 58).Value & "'" sql = sql & "WHERE (" & " joken1 = '" & .Cells(row, 3).Value & "') " End With ' '結果OK komoku2 20200717103000へ更新される 'joken1 = 3620313 でkomoku1を15へとkomoku2を20200717103000へ更新 ' With ActiveSheet sql = "" sql = sql & "UPDATE table1" & vbCrLf sql = sql & "set komoku1 = " & "'" & .Cells(row, 6).Value & "'" & vbCrLf sql = sql & "set komoku2 = " & "'" & .Cells(row, 58).Value & "'" & vbCrLf sql = sql & "WHERE (" & " joken1 = '" & .Cells(row, 3).Value & "') " End With '結果NG komoku1を15へとkomoku2を20200717103000へ両方共更新されない 'joken2 = 20200730でkomoku1を15へ更新 With ActiveSheet sql = "" sql = sql & "UPDATE table1" & vbCrLf sql = sql & "set komoku1 = " & "'" & .Cells(row, 6).Value & "'" sql = sql & "WHERE (" & " joken2 = '" & .Cells(row, 4).Value & "') " End With '結果OK komoku1 15へ更新される 'joken2 = 20200730でkomoku2を20200717103000へ更新 With ActiveSheet sql = "" sql = sql & "UPDATE table1" & vbCrLf sql = sql & "set komoku2 = " & "'" & .Cells(row, 58).Value & "'" & vbCrLf sql = sql & "WHERE (" & " joken2 = '" & .Cells(row, 4).Value & "') " End With '結果OK komoku2 20200717103000へ更新される 'joken2 = 20200730でkomoku1を15へkomoku2を20200717103000へ更新 With ActiveSheet sql = "" sql = sql & "UPDATE table1" & vbCrLf sql = sql & "set komoku1 = " & "'" & .Cells(row, 6).Value & "', " & vbCrLf sql = sql & "set komoku2 = " & "'" & .Cells(row, 58).Value & "' " & vbCrLf sql = sql & "WHERE (" & " joken2 = '" & .Cells(row, 4).Value & "') " End With '結果NG komoku1 15へとkomoku2 20200717103000へ両方共更新されない

  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.3

ならば、 UPDATE table1 set komoku1 = 'ABC', set komoku2 = 'DEF' WHERE (( joken1 = 'GHI') and (joken2 = 'JKL')) つまり、 joken1 の列が 'GHI' かつ、 joken2 の列が 'JKL' のレコードなら set komoku1 列に 'ABC' set komoku2 列に 'DEF' を書き込みなさい。 といったsql文になるものと思いますので VBAであれば、以下でいかがでしょうか。 Sub hogehoge()  Dim sql As String  Dim row As Long    row = 9  With ActiveSheet   sql = ""   sql = sql & "UPDATE table1" & vbCrLf   sql = sql & "set komoku1 = " & "'" & .Cells(row, 6).Value & "'" & vbCrLf   sql = sql & "set komoku2 = " & "'" & .Cells(row, 58).Value & "'" & vbCrLf   sql = sql & "WHERE ((" & " joken1 = '" & .Cells(row, 3).Value & "') and" & vbCrLf   sql = sql & "    (" & " joken2 = '" & .Cells(row, 4).Value & "'))"  End With    Debug.Print sql  With cmd   .CommandText = sql   .CommandType = adCmdUnknown   .Execute  End With End Sub

3620313
質問者

お礼

回答ありがとうございます

3620313
質問者

補足

上記マクロ実行しましたが更新されないです。イミディエイトウィンドウの表示は UPDATE table1 set komoku1 = 'ABC', set komoku2 = 'DEF' WHERE (( joken1 = 'GHI') and (joken2 = 'JKL')) の通りであっているのですが…

  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.2

#1の継続です。 ごめんなさい。質問をしっかり読まず、安易にコメントしてしまいました。 WHERE (( joken1 = 'GHI') and (joken1 = 'JKL')) この条件を満たすレコードはあり得ないです。 >違うテーブルで条件を2つにして設定する場合 >ActiveSheet.Cells(row, 3) と ActiveSheet.Cells(row, 4)のAND条件で設定する場合 この記述を説明しなおしてみてください。 更新する対象のテーブルが複数あるんですか? それとも、 更新対象のレコードを、複数のフィールドの値で絞るんですか?

3620313
質問者

お礼

回答ありがとうございます

3620313
質問者

補足

WHERE (( joken1 = 'GHI') and (joken1 = 'JKL')) この条件を満たすレコードはあり得ないです。 → 申し訳ありません。説明不足でした。 ”更新対象のレコードを、複数のフィールドの値で絞る” です。 UPDATE table1 set komoku1 = 'ABC', set komoku2 = 'DEF' WHERE (( joken1 = 'GHI') and (joken2 = 'JKL')) の構成になります。 Dim sql As String  Dim row As Long    row = 9  With ActiveSheet   sql = ""   sql = sql & "UPDATE table1" & vbCrLf   sql = sql & "set komoku1 = " & "'" & .Cells(row, 6).Value & "', " & vbCrLf   sql = sql & "set komoku2 = " & "'" & .Cells(row, 58).Value & "' " & vbCrLf   sql = sql & "WHERE ((" & " joken1 = '" & .Cells(row, 3).Value & "') and" & vbCrLf   sql = sql & "    (" & " joken2 = '" & .Cells(row, 4).Value & "'))"  End With    Debug.Print sql  With cmd   .CommandText = sql   .CommandType = adCmdUnknown   .Execute  End With でやってみたのですが、更新されないですね。

  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.1

UPDATE table1 set komoku1 = 'ABC', set komoku2 = 'DEF' WHERE (( joken1 = 'GHI') and (joken1 = 'JKL')) といったsql文になるものと思いますので VBAであれば、以下でいかがでしょうか。 Sub hogehoge()  Dim sql As String  Dim row As Long    row = 9  With ActiveSheet   sql = ""   sql = sql & "UPDATE table1" & vbCrLf   sql = sql & "set komoku1 = " & "'" & .Cells(row, 6).Value & "', " & vbCrLf   sql = sql & "set komoku2 = " & "'" & .Cells(row, 58).Value & "' " & vbCrLf   sql = sql & "WHERE ((" & " joken1 = '" & .Cells(row, 3).Value & "') and" & vbCrLf   sql = sql & "    (" & " joken1 = '" & .Cells(row, 4).Value & "'))"  End With    Debug.Print sql  With cmd   .CommandText = sql   .CommandType = adCmdUnknown   .Execute  End With End Sub SQL文の中に全角スペースが含まれないように留意してください。

関連するQ&A

  • 複数条件でoracleデータ更新

    office2016 Oracle12C excelの A1にTEST C1にSERIAL01 F1にKOTEI1 のデータが入っていて、oracleのテーブルデータをexcelマクロで更新させようとしています。 oracle接続等のコマンドは省略してポイント部分のマクロだけ記載します。 (1) With cmd .CommandText = "UPDATE TABLE1  set KOMOKU1 = '" & ActiveSheet.Cells(1, 1) & "' WHERE KOMOKU3 = '" & ActiveSheet.Cells(1, 3) & "' " End With 上記(1)を実行すると、oracleのTABLE1のデータはSERIAL01に関して KOMOKU1の列がTESTに更新されます。 (2) With cmd .CommandText = "UPDATE TABLE1  set KOMOKU1 = '" & ActiveSheet.Cells(1, 1) & "' WHERE KOMOKU6 = '" & ActiveSheet.Cells(1, 6) & "'" End With 上記(2)を実行すると、oracleのTABLE1のデータはKOTEI1に関して KOMOKU1の列がTESTに更新されます。 (3) やりたい内容は、 KOMOKU3がSERIAL01 KOMOKU6がKOTEI1 のAND条件だった場合に、KOMOKU1を更新させたいので、 With cmd .CommandText = "UPDATE TABLE1  set KOMOKU1 = '" & ActiveSheet.Cells(1, 1) & "' WHERE KOMOKU3 = '" & ActiveSheet.Cells(1, 3) & "' AND KOMOKU6 = '" & ActiveSheet.Cells(1, 6) & "'" End With の様なマクロを実行するのですが、対象のKOMOKU1がデータ更新されません。 何が悪いのか修正いただきたく。

  • excelで’付きデータのoracle登録

    office2010 oracle12c 下記のexcelマクロで文字列の中に'があるとoracleのテーブルにデータ登録できません。 Option Explicit ' ADOのオブジェクト変数を宣言 Private cnn As New ADODB.Connection Private cmd As New ADODB.Command Sub add() On Error GoTo err_hdr Sheets("table").Select ' ' Oracleの接続 cnn.Open "Provider=OraOLEDB.Oracle;" & _ "Data Source=Source_name;", "ID", "PW" Set cmd.ActiveConnection = cnn '追加の例 Dim row As Long row = 1 Do Until ActiveSheet.Cells(row, 1) = "" With cmd .CommandText = "insert into table " & " (name1, name2)" & "" _ & "VALUES('" & ActiveSheet.Cells(row, 1) & "','" & ActiveSheet.Cells(row, 2) & "')" .CommandType = adCmdUnknown .Execute End With row = row + 1 Loop cnn.Close Set cmd = Nothing Set cnn = Nothing Exit Sub err_hdr: Resume Next End Sub 具体的には name2のデータがPEOPLEだと上記マクロでoracleのtableにデータ登録できますが、 name2のデータがPEOPLE'Sの様に'がついているとデータ登録できません。 ’付きの文字列を、上記マクロ修正してデータ登録可能でしょうか?

  • 【Excel VBA】コードの書き方『AまたはBだったら…』

    Excel2003を使用しています。 マクロで、『A列-C列が0じゃなかったら、選択範囲をコピーする』という処理をしていますが、これを『A列-C列、または、Q列-S列が0じゃなかったら…』というふうにもうひとつ条件を加えたいのですが、どのように書いたらいいのでしょうか? コード(一部)は下記のようになっていますが、これでは間違っているようです。 マクロ勉強中ですので、ここはこういうふうに…と指摘していただけると助かります。お手数ですが、よろしくお願いします。    ・    ・    ・  i = Selection(1).Row  j = Selection(1).Column  k = Selection(Selection.Count).Row  l = Selection(Selection.Count).Column  With Sheets("○月")  For m = i To k  If (.Cells(m, "A") - .Cells(m, "C") <> 0 Or .Cells(m, "Q") - .Cells(m, "S") <> 0) Then  .Range(.Cells(m, j), .Cells(m, l)).Copy    ・    ・    ・

  • マクロ:データの抽出(複数条件)

    エクセルで以下のようなマクロを作成しました。 シート1のG列がシート2のF4と合致する時、シート2のC列にシート1のB列を貼り付けるのですが、条件を増やし 「シート1G列がシート2のF4と一致」かつ「シート1H列がシート2のG5と一致」かつ「シート1I列がシート2のH5と一致」かつ・・・としたいのですが、If Thenをどのように記述したらよろしいでしょうか。(AND関数の機能です) 宜しくお願いいたします。 Sub data01() With Sheets("Sheet1") x = .UsedRange.Cells(.UsedRange.Count).Row For i = 5 To x If .Cells(i, "G").Value = Worksheets("Sheet2").Range("F4").Value Then n = n + 1 Sheets("Sheet2").Cells(n + 5, "C").Value = .Cells(i, "B").Value End If Next End With End Sub

  • VBAでIFの複数条件がうまく動きません。

    エラー表示がなくローカルでも見れませんでした。 修正箇所が分からずにいます。 詳しい方教えてください。 何卒よろしくお願いいたします。 ※S、T列に★は入るのですがA列の条件(10000以下)やS列の条件(空白以外)を無視して★が入っています。 作業内容 '(1)A列<従業員ID>のフィルターを数字フィルターで10000以上に設定 '(2)I列<所属>のフィルターを「秋田・長野・栃木・本社」以外に設定 '(3)L列<就労状況>のフィルターを「退職」以外に設定 '(4)M列<勤務形態>のフィルターを「常勤」以外に設定 '(5)S列<資格者>のフィルターを「(空白)」に設定 '(6)J列<エントリー時の保有資格>のフィルターを「aaa・bbb・ccc・ddd」に設定 For r = Cells(Rows.Count, 1).End(xlUp).Row To 4 Step -1 If Cells(r, "A") >= 10000 And _ Not Cells(r, "I") Like "*秋田*" Or Not Cells(r, "I") Like "*長野*" Or _ Not Cells(r, "I") Like "*栃木*" Or Not Cells(r, "I") Like "*本社*" And _ Not Cells(r, "L") Like "退職" And _ Not Cells(r, "M") Like "常勤" And _ Cells(r, "S") Like "" And _ Cells(r, "J") Like "*aaa*" Or Cells(r, "J") Like "*bbb*" Or Cells(r, "J") Like "*ccc*" Or Cells(r, "J") Like "*ddd*" Then Cells(r, "S") = "★" Cells(r, "T") = "★" End If Next r End Sub

  • 複数の列を繋げてA列に入れたい VBA

    aaa aaa  bbb aaa  bbb  ccc aaa (A列にaaa、B列にbbb、C列にcccが入ってます) と言うデータがあるのですが 全てA列に入れて aaa aaabbb aaabbbccc aaa としたいです。 ・最終列は必ずしもCではないのです。(Dの場合もEの場合もある) ・最終行も変化します。 Sub 分かれてる列を繋げる() Dim Col As Long Dim Row As Long For Row = 1 To Range("a65536").End(xlUp).Row   For Col = 1 To Cells(Row, 256).End(xlToLeft).Column    Cells(Row, 1) = Cells(Row, 1) & Cells(Row, 2) & Cells(Row, 3)    Next Col Next Row End Sub をやってみましたが、 aaa aaabbbbbb aaabbbcccbbbcccbbbccc aaa となってしまい、 欲しい結果とは違くなってしまいます。

  • VBAの複数条件分岐について

    VBAで下記の構文を使用してシート1にある表より 条件に合致するもののみシート2に抽出するようにしています。 現在はシート1のE2セルの値がシート1のB列の値と比較して 該当するものを抽出しています。 この条件が、 シート1のE1のセルの値が20より小さい場合、 かつE2のセルの値がシート1のB列の値と比較して該当するものを シート1に貼り付け、 シート1のE1のセルの値が20以上の場合、 かつE2のセルの値がシート1のD列の値と比較して該当するものを シート1に貼り付ける というような条件に変えたいのですが どのように変更したらよろしいのでしょうか。 よろしくご教授下さい。 ちなみに現在使用している構文です。 これもきれいな構文かはわからないのですが・・・ Sub test() Dim sh1 As Worksheet Dim sh2 As Worksheet Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2") k = 1 sh2.Cells(k, "B") = sh1.Cells(1, "A") sh2.Cells(k, "C") = sh1.Cells(1, "B") k = k + 1 d = sh1.Range("A65536").End(xlUp).Row For i = 2 To d If sh1.Cells(i, "B") <= sh1.Range("E2") Then sh2.Cells(k, "B") = sh1.Cells(i, "A") sh2.Cells(k, "C") = sh1.Cells(i, "B") k = k + 1 End If Next i sh2.Activate End Sub

  • Excel VBA 条件を満たすデータのコピーと計算結果の表示

    Excel2003を使用しています。 Sheet1のある選択範囲に対して(都度、手動で選択します) D列-E列が0でなかったら、その行のデータをSheet2のアクティブセル以下にコピーするという処理を下記のマクロでしています。 下記のマクロにコードを追加することによって、条件を満たすデータをコピーする際、D列-E列の計算結果をSheet2のD列に表示させることは可能でしょうか? 例えば、Sheet1のD5セルに100、E5セルに50と数値が入力されていた場合、Sheet2のD7セルに50と計算結果を表示させたいですのですが…。 (貼り付け先の行は、アクティブセルの行です) よろしくお願いします。 -------------------------------------------------- Sub Macro1()  Sheets("Sheet1").Activate '選択範囲のサイズ取得   With Selection    i = .Cells(1).Row    j = .Cells(1).Column    k = .Cells(.Count).Row    l = .Cells(.Count).Column   End With  Sheets("Sheet2").Activate   ActR = ActiveCell.Row   ActC = ActiveCell.Column  With Sheets("Sheet1")   For m = i To k    If .Cells(m, 4) - .Cells(m, 5) <> 0 Then     .Range(.Cells(m, j), .Cells(m, l)).Copy     Sheets("Sheet2").Cells(ActR, ActC).PasteSpecial Paste:=xlPasteAllExceptBorders     ActR = ActR + 1     Application.CutCopyMode = False    End If   Next  End With End Sub

  • エクセルのマクロについて

    Sub ア_Click() Dim i As Long With ActiveSheet For i = 5 To .Cells(Rows.count, "C").End(xlUp).Row If InStr(.Cells(i, "C"), "ア") = 0 Then If InStr(.Cells(i, "D"), "ア(半角)") = 0 and .Cells(i,"D")<>"" Then MsgBox i & "行目" Cells(i, 2).Offset(0, -1).Value = "★" End If End If Next i End With End Sub このエクセルマクロはC列に「ア」があって、D列に「ア(半角)」の文字がない場合はメッセージというマクロなのですが、このマクロをア~ンまで同じ作業をしたいのですが、ひとまとめにマクロを組む事はできるのでしょうか?できる場合どのようにすれば良いでしょうか? 下記のようにして見たのですができませんでした。 Sub ア_Click() Dim i As Long With ActiveSheet For i = 5 To .Cells(Rows.count, "C").End(xlUp).Row If InStr(.Cells(i, "C"), "[ア-ン]") = 0 Then If InStr(.Cells(i, "D"), "[ア-ン](半角)") = 0 and .Cells(i,"D")<>"" Then MsgBox i & "行目" Cells(i, 2).Offset(0, -1).Value = "★" End If End If Next i End With End Sub

  • 印刷範囲を設定するvbaコード

    エクセルシートの印刷範囲を設定するvbaコードで Sub Macro1() With ActiveSheet.PageSetup .PrintArea = "$A$1:$c$10" End With End Sub としてるのですが、 "$A$1:$c$10"の部分を Range(Cells(1, 1), Cells(10,3)) 形式でやりたいのですが、 うまくできません。 Sub Macro1() With ActiveSheet.PageSetup .PrintArea = Range(Cells(1, 1), Cells(10,3)) End With End Sub としても、全部が印刷範囲として選択されてしまいます。 というか、印刷範囲が設定されません。

専門家に質問してみよう