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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

3回答

1245閲覧

VBAでExcelのデータをDBに更新登録したい。

lemon0502

総合スコア8

VBA

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

1クリップ

投稿2018/10/16 07:16

VBAで、Excel上のデータをデータベースに更新登録を行いたいのですが、エラーが出てしまいつまずきました。みなさんの知恵をお借りしたいです。
よろしくお願いします。

~概要~
このFunctionは、ClickイベントからCallで呼び出しています。
Excelの表の中から"□"が"■"になっている行のデータのみ、データベースに更新登録します。

Function Regist_Table() As Integer '################################################################## 'データの新規登録・更新 '################################################################## Dim objRs As New ADODB.Recordset Dim Renw As ADODB.Command '更新用 Dim strSqlString As String Dim strSetValue As String Dim J As Long Dim RowStart As Integer Dim YouinID As Integer Dim Str_GetTime As String Dim WshNetworkObject As Object Dim StrUsername As String Dim IntTemp As Integer Regist_Table = 0 '********************************************* 'DB接続 '********************************************* Call connectSQL '********************************************* '更新ボックスデータ取得 '********************************************* Dim i As String i = 10 Do Until Cells(i, 2).Value = "" If Cells(i, 2).Value = "■" Then '********************************************* '新規データか更新かを要員IDをベースにチェック '*********************************************   '//要員情報 '//要員IDの有無をチェック strSqlString = "" strSqlString = strSqlString & "Select " strSqlString = strSqlString & " count(*) as 要員ID" strSqlString = strSqlString & "From " strSqlString = strSqlString & " M_要員情報 " strSqlString = strSqlString & "Where " strSqlString = strSqlString & " 要員ID = '" & Worksheets("要員所属情報一括メンテナンス").Cells(i, 4).Value & "' " Set objRs = New ADODB.Recordset '//更新 = ■の時にエラーが出る↓ オートメーションエラーです。   objRs.Open strSqlString, g_objConn, adOpenStatic End If '//メッセージの表示   '//更新 = □で来た時にエラーが出る↓ アプリケーション定義またはオブジェクト定義のエラーです。 If objRs("要員ID") = 0 Then ElseIf MsgBox("処理を中止します。", vbOK + vbInformation) Then Exit Function Else '//データの更新 strSqlString = "" strSqlString = strSqlString & "Update " strSqlString = strSqlString & " M_要員情報" strSqlString = strSqlString & "Set " strSqlString = strSqlString & " 要員ID = '" & Worksheets("要員所属情報一括メンテナンス").Cells(i, 4).Value & "' " strSqlString = strSqlString & " 社員番号 = '" & Worksheets("要員所属情報一括メンテナンス").Cells(i, 5).Value & "' " strSqlString = strSqlString & " 姓 = '" & Worksheets("要員所属情報一括メンテナンス").Cells(i, 6).Value & "' " strSqlString = strSqlString & " 名 = '" & Worksheets("要員所属情報一括メンテナンス").Cells(i, 7).Value & "' " strSqlString = strSqlString & " 姓かな = '" & Worksheets("要員所属情報一括メンテナンス").Cells(i, 8).Value & "' " strSqlString = strSqlString & " 名かな = '" & Worksheets("要員所属情報一括メンテナンス").Cells(i, 9).Value & "' " strSqlString = strSqlString & " 協力会社フラグ = '" & Worksheets("要員所属情報一括メンテナンス").Cells(i, 10).Value & "' " strSqlString = strSqlString & " 利用不可フラグ = '" & Worksheets("要員所属情報一括メンテナンス").Cells(i, 11).Value & "' " strSqlString = strSqlString & " 在籍フラグ = '" & Worksheets("要員所属情報一括メンテナンス").Cells(i, 12).Value & "' " Regist_Table = 1 End If

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

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

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

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

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

guest

回答3

0

ベストアンサー

恐らくSQLでしょう。
よくあるエラーパターンです。

" count() as 要員ID"
"From "
を結合させると、
" count(
) as 要員IDFrom "
となっているはずです。

個人的には、↓の方法を取ります。
Dim Dic As Scripting.Dictionary '※参照設定が必要です。
Set Dic = New Scriptiong.Dictionary
Dic.Item(Dic.Count) = "SQL1"
Dic.Item(Dic.Count) = "SQL2"
Dic.Item(Dic.Count) = "SQL3" etc
Dim SQL As String
SQL = Join(Dic.Items," ")

または、結合する文字列の頭に、必ず半角スペースを入れる(後ろだと忘れやすいので)
という方法をとったりします。

投稿2018/10/16 09:35

ExcelVBAer

総合スコア1175

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

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

lemon0502

2018/10/17 01:37

まさにそれでした。。また、strSqlString = strSqlString & " 要員ID = '" & Worksheets("要員所属情報一括メンテナンス").Cells(i, 4).Value & "' " のシングルクォーテーションもエラーの原因でした。要員IDがint型にも関わらず ' ' でくくることで文字列として送っていました。。 この度はありがとうございました。
guest

0

Excelの表の中から"□"が"■"になっている行のデータのみ、データベースに更新登録します。

objRs.Openは"■"の時に行われていますから、まず最初に"■"が現れないと、"□"の処理は必ずエラーとなりますが、データはそのようになっていますか?

いずれにしても、objRs.Openで失敗しているという事は、g_objConnの内容が正しくなく接続できていないのではないかと思われます。

投稿2018/10/16 08:04

sazi

総合スコア25184

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

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

0

SQL

1update テーブル名 set カラム1='aaa',カラム2='bbb'

strSqlString をdebug.printで出力してみたらいかがでしょうか?
カンマがないのでは?
また、エラー内容を教えていただきたいです

投稿2018/10/16 07:57

roast_chicken

総合スコア254

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問