SQLでテーブル1に該当レコードがなければインサート
あればアップデートをする処理をしたいのです

IF ??? THEN
UPDATE テーブル1 SET SELECT * FROM テーブル2 WHERE 条件
ELSE
INSERT INTO テーブル1(SELECT * FROM テーブル2)
END IF

???はプライマリキーで判定をしようと考えています

こんな感じでやろうとしたところ
うまくいきませんでした
VB上で実行しよううとしているからなのでしょうか?
ADOでSQLサーバに接続しています
条件分岐もどういう条件(VBでの書き方)がわからないです。

よろしくお願いします。

A 回答 (1件)

>SQLでテーブル1に該当レコードがなければ



SELECT文はご存知ですか?
条件を満たすレコードを取得することができます。
これを使用すれば、条件判定ができます。

ADODB.Recordsetオブジェクト(rso)のEOFで取得できます。

If rso.EOF = False Then
'ある
Else
'ない
end if
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QエクセルVBEモジュールにif then elseを使ってマクロを書き

エクセルVBEモジュールにif then elseを使ってマクロを書きました。thenとelseの中間ぐらいでmsgbox”お知らせ”を書いて実行するとメッセージボックスは正しく表示します。しかしポインターがメッセージボックスウィンドウの外にあるときは砂時計が動き続け、メッセージボックスの上に置けば普通の矢印に変わります。砂時計を出さない方法はどうしたらよいのでしょうか。msgbox”お知らせ”の下行に続けてexit subまたはon error goto 0を書いてもやはり時計がでてしまいます。どうしたらよいのでしょうか。

Aベストアンサー

コード実例が書いてなくて、情況が理解しづらく、言っていることがおかしいように思う。
挿入ー標準モジュールに(標準モジュールに入れてますか)
Sub test01()
If Cells(1, "A") = "1" Then
MsgBox "1です"
Else
MsgBox "1では在りません"
End If
End Sub
と入れてA1セルに1を入れて実行。
また2を入れて実行。
で質問と同じ現象になりますか?
質問者のコードはこれと似たようなコードですか。
そもそも質問をするのに、短いならばコードを挙げて質問するものですよ。
一瞬以上の砂時計が出るとは考えられない。
砂時計が出るのは、内部処理に時間がかかっているためで、
OSの仕組みに根ざしているので、出さないようにすると言う選択肢は、普通それだけを問題にされない。
ユーザー側で意識的に出すようにするのか下記コード。
他にカーソルポインターの形は、変えることが出来る。
http://support.microsoft.com/kb/408038/jaを参照。
時間がかかる処理をやってみると
Sub test02()
For i = 1 To 100000000
i = i + 1
Next i
MsgBox "終了"
End Sub
のようなものだと数秒間は砂時計が現れるとおもう。
ーーーー
他にマウスカーソルをエクセル画面内で変える
ub test02()
'Application.Cursor = xlWait '砂時計
'Application.Cursor = xlDefault
Application.Cursor = xlNorthwestArrow
'Application.Cursor = xlIBeam

For i = 1 To 100000000
i = i + 1
Next i
MsgBox "終了"
End Sub
の上の4行。しかしこれは処理中の砂時計と同類のことではない。

コード実例が書いてなくて、情況が理解しづらく、言っていることがおかしいように思う。
挿入ー標準モジュールに(標準モジュールに入れてますか)
Sub test01()
If Cells(1, "A") = "1" Then
MsgBox "1です"
Else
MsgBox "1では在りません"
End If
End Sub
と入れてA1セルに1を入れて実行。
また2を入れて実行。
で質問と同じ現象になりますか?
質問者のコードはこれと似たようなコードですか。
そもそも質問をするのに、短いならばコードを挙げて質問するものですよ。
一瞬以上の砂時計が出るとは考えられない...続きを読む

QSQLでSELECTの中でSELECT文を作りたいのですが。

開発環境 VB6 WINXP 
SQLで、次のそれぞれの文((1)、(2))は問題なく動作しますが、これを合体させて、絞り込むにはどうしたら良いのでしょうか。
(1) strSQLM = "SELECT * FROM 漁獲DATA WHERE 日付 =#" & Format(PickedDate, "m-d-yy") & "#"
(2) strSQLM = "SELECT * FROM 漁獲DATA WHERE 順位 =" & Meigara

つまり同一の日の同じ順位のデータを調べたいのですが。よろしくお願いします。

Aベストアンサー

>上の文だと、抽出条件でデータ型が一致しません。となってしまいました。どうすれば良いのでしょうか。Meigaraは数値です。

Meigaraは数値でしたか。自分は「○位」という感じの文字列だと思っていました。その場合は「順位 =」のあとにある「'」と一番最後にある「Meigara」から後ろを消せば良いです。消した場合のSQL文は下記になります。

strSQLM = "SELECT * FROM 漁獲DATA WHERE 日付 ='" & Format(PickedDate, "m-d-yy") & "' AND 順位 =" & Meigara

これで大丈夫なはずですよ。

QVBSによるプログラミングでif構文の条件の設定方法について

VBSによるプログラミングでif構文の条件の設定方法について

if構文を作る際の条件設定で
例:電圧を条件に取りたい場合
elseif (voltage>5 and voltage<=(10+x)) then
の様にして、条件の中に「(10+x)」の様に関数や計算式を入れることは可能なのでしょうか?
何故かここの部分だけ動かないという状態に陥ってしまいました。
ちなみに、(10+x)の部分に整数である20などを入れると、正常に動く為、ここのスクリプトがおかしいのだと思っています。

Aベストアンサー

>(10+x)の部分に整数である20などを入れると、正常に動く為
>ここのスクリプトがおかしいのだと思っています。

そこがおかしいかどうかは
次のような単純なコードで確認できますよね。
--------------------------------------------
Dim x, voltage
x = 20
voltage =15
If voltage <= 5 Then
MsgBox voltage & "。。。<=5"
ElseIf (voltage > 5 And voltage <= (10 + x)) Then
MsgBox voltage & "。。。5>and<=(10+" & x & ")"
Else
MsgBox voltage & "。。。>(10+" & x & ")"
End If
--------------------------------------

何れにしろ、(10+X)が原因ではないことだけは確かですから
voltage,xの値、ifの流れを念入りにチェックしてみたらどうでしょう。
以上です。

>(10+x)の部分に整数である20などを入れると、正常に動く為
>ここのスクリプトがおかしいのだと思っています。

そこがおかしいかどうかは
次のような単純なコードで確認できますよね。
--------------------------------------------
Dim x, voltage
x = 20
voltage =15
If voltage <= 5 Then
MsgBox voltage & "。。。<=5"
ElseIf (voltage > 5 And voltage <= (10 + x)) Then
MsgBox voltage & "。。。5>and<=(10+" & x & ")"
Else
MsgBox voltage & "。。。>(10+" & x & ")"
End If
-----------...続きを読む

Q#If VBA7 Thenに関して

VBAを使っていて

http://blog.goo.ne.jp/mumbai/e/dc90cf94fc40baebf807f1913de4fc10

#If VBA7 Then
Debug.Print "EXCELは2010以上です。"
#Else
Debug.Print("EXCELは2007以下です。")
#End If

というように、#IFというようなものが出てきます。

これの使用方法を知りたいのですが検索して調べたところ、

https://msdn.microsoft.com/ja-jp/library/tx6yas69.aspx

このページに書かれてあるように
#があるとコンパイル時にif文の評価を行うのに対し、
#がないとif文も含めてコンパイルした後に、プログラムを実行する時にif文の評価を行う
といったことが書かれてあります。

それで試してみたのですが


#If VBA7 Then
aa=0
#Else
aa=1
#End If


というコードを実行するとaa=0が代入されます。

一方で

If VBA7 Then
aa=0
Else
aa=1
End If
というコードを実行するとVBA7がemptyになっており
aa=1が代入されます。

これはVBA7という変数がコンパイル時にのみ有効で
実行時には存在しないためだからでしょうか?

VBAを使っていて

http://blog.goo.ne.jp/mumbai/e/dc90cf94fc40baebf807f1913de4fc10

#If VBA7 Then
Debug.Print "EXCELは2010以上です。"
#Else
Debug.Print("EXCELは2007以下です。")
#End If

というように、#IFというようなものが出てきます。

これの使用方法を知りたいのですが検索して調べたところ、

https://msdn.microsoft.com/ja-jp/library/tx6yas69.aspx

このページに書かれてあるように
#があるとコンパイル時にif文の評価を行うのに対し、
#がないとif文も含...続きを読む

Aベストアンサー

少しだけですが、
#If VBA7 Then
aa=0
#Else
aa=1
#End If
の『VBA7』は条件付きコンパイル中で使える定数です。
あらかじめVBAの中に組み込まれています。

で、
If VBA7 Then
aa=0
Else
aa=1
End If
とした場合の『VBA7』は一般的な単なる変数です。

VBEでツール→オプションの編集タブにある「変数の宣言を強制する」に
チェックを入れてあると
「コンパイルエラー :変数が定義されていません」になるはずです。
でチェックを入れていない場合はVariant型として定義されますので
Empty値の初期値は、False、0、"" のいずれかになりますから
If VBA7 Then → False → aa=1 となるわけです。

QExcel VBA「If else」の使い方

Excelで管理台帳を作っています

コマンドボタンをクリックすると、元データ「受給者情報」シートから今月利用終了となる人のリストを「利用終了者」シートに抽出できるようにしています
正しい作り方ではないのかもしれませんが、これでちゃんと抽出できているから抽出自体はこれでも問題ないと思います(^_^;)

それはいいのですが、対象となる人がいない場合、抽出先の「利用終了者」シートにはタイトル行しか出ません。

それでも構わないのですが、できたら抽出データがない場合(A2セルより下のデータがない場合)は、「今月で終了の利用者はいません」とメッセージを出し、「top_page」シートに移動させたいのです

そのやり方がうまくいきません

現時点はこのように入れています


Private Sub CommandButton2_Click()
Worksheets("利用終了者").Select
Worksheets("利用終了者").Range("A:M").Clear
With Worksheets("受給者情報")
.Range("A:M").Copy Worksheets("利用終了者").Range("A1")
.Range("A:Q").AdvancedFilter _
Action:=xlFilterCopy, _
criteriarange:=.Range("U1:V3"), _ 
CopyToRange:=Worksheets("利用終了者").Range("A:M"), _
unique:=False
End With
MsgBox "今月末で終了の利用者です!", vbOKOnly + vbInformation, "確認"
If MsgBox("印刷しますか?", vbYesNo + vbQuestion, "印刷") = vbNo Then
Exit Sub
End If
Worksheets("利用終了者").PrintOut
Sheets("top_page").Select
Range("a1").Select
End Sub




If elseを使うんだろうな、というのは何となくわかるのですが、どこにどう入れたらちゃんと反応するのかわかりません。

一度、

 (前略)
If Application.CountA(Range("A2")) = 0 Then
MsgBox "今月末で終了の利用者はいません", vbOKOnly + vbInformation, "確認"
Else
MsgBox "今月末で終了の利用者です!", vbOKOnly + vbInformation, "確認"
If MsgBox("印刷しますか?", vbYesNo + vbQuestion, "印刷") = vbNo Then
Exit Sub
End If
Worksheets("利用終了者").PrintOut
End If
Sheets("top_page").Select
Range("a1").Select
End Sub

と入れてみたのですが、これだと2行目以降もデータがあっても、「今月末で終了の利用者はいません」となってしまいます

2行目以降にデータがある場合は「今月末で終了の利用者です!」とメッセージボックスを出し、2行目以降にデータがない場合は「今月末で利用終了の利用者はいません」とメッセージボックスを出したいです

そのやり方を教えてください。お願いします
ちなみにバージョンはExcel2010です

Excelで管理台帳を作っています

コマンドボタンをクリックすると、元データ「受給者情報」シートから今月利用終了となる人のリストを「利用終了者」シートに抽出できるようにしています
正しい作り方ではないのかもしれませんが、これでちゃんと抽出できているから抽出自体はこれでも問題ないと思います(^_^;)

それはいいのですが、対象となる人がいない場合、抽出先の「利用終了者」シートにはタイトル行しか出ません。

それでも構わないのですが、できたら抽出データがない場合(A2セルより下のデータがない...続きを読む

Aベストアンサー

End With 以降は、こうなるのでしょうか。
それと、Range("a1").Select は、エラーが出ないとヘンですよね。

'//...

 End With
 If Application.CountA(Worksheets("利用終了者").Range("A:A")) > 1 Then
  MsgBox "今月末で終了の利用者です!", vbOKOnly + vbInformation, "確認"
  If MsgBox("印刷しますか?", vbYesNo + vbQuestion, "印刷") = vbYes Then
   Worksheets("利用終了者").PrintOut
  End If
 Else
  MsgBox "今月で終了の利用者はいません", 64
 End If
 Application.Goto Sheets("top_page").Range("A1")
End Sub


人気Q&Aランキング

おすすめ情報