プロが教えるわが家の防犯対策術!

VB.NETでセルの1行を順番に読み取って、DBに登録(INSERT)していく処理を施しています。

Excelの中身を1行ずつ読み取るところまでは出来たのですが、そこからループでDBへINSERTさせるための書き方が分かりません。

【コード】
For Each v In xlSheet.Range("A4:V4", xlSheet.Range("A" & xlApp.Rows.Count).End(Excel.XlDirection.xlUp)).Value


Dim strINSERT As String

strINSERT = ""

strINSERT = strINSERT & "INSERT INTO "
strINSERT = strINSERT & "dbo.TBL_SHIPMENT "
strINSERT = strINSERT & "("
strINSERT = strINSERT & "[Division], " ’文字列型
strINSERT = strINSERT & "[Sales Org], "    ’文字列型
strINSERT = strINSERT & "[Sales Office], "   ’文字列型
strINSERT = strINSERT & "[Plant], "       ’文字列型
strINSERT = strINSERT & "[Shipment Date], " ’date型
strINSERT = strINSERT & "[Material], "     ’文字列型
strINSERT = strINSERT & "[Packlist #], "    ’文字列型
strINSERT = strINSERT & "[Invoice Date], "   'date型
strINSERT = strINSERT & "[Fiscal Date], "    '文字列型
strINSERT = strINSERT & "[Quantity], " 'decimal型
strINSERT = strINSERT & "[Invoice #], " '文字列型
strINSERT = strINSERT & "[Value USD], " 'decimal型
strINSERT = strINSERT & "[Unit Cost USD], " 'decimal型
strINSERT = strINSERT & "[Total Cost], "    ’decimal型
strINSERT = strINSERT & "[Order Type], " '文字列型
strINSERT = strINSERT & "[Material Group], " '文字列型
strINSERT = strINSERT & "[Sold To Customer], " '文字列型
strINSERT = strINSERT & "[Customer Name]" '文字列型
strINSERT = strINSERT & ") "
strINSERT = strINSERT & "VALUES "
strINSERT = strINSERT & "("

’ === ここから分からない ============



お分かりのかた教えて頂けると幸いです。


OS:Windows10
ツール:Visual Studio2019
Ver:.NET Framework4.8

A 回答 (7件)

No.6です。


修正します。

>と『1行ずつ』ではなく『列方向に1セルずつ』の値を取得してますよね?

と『1行単位』ではなく『行方向に1列毎=1セルずつの値』をしゅとくしてますよね?

の方が適切でしたかね。
VBAであればA4~A列最終行をRange型で For Each してResizeするのはお分かりになるかと。
多分似たような事をすれば良いのではないでしょうか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
確かに中身を確認すると行方向に1列毎の取得をしています。
行ごとに取得出来ているので、そこはイメージ通りですね。

そうですね。
一度やってみます。

お礼日時:2020/09/25 11:45

>Excelの中身を1行ずつ読み取るところまでは出来たのですが



もし質問文にある

>For Each v In xlSheet.Range("A4:V4", xlSheet.Range("A" & xlApp.Rows.Count).End(Excel.XlDirection.xlUp)).Value

これの事だとしたら。
このコードって
・A4~A列最終行の値
・B4~B列最終行(A列基準)の値
・C4~ 以下同文
と『1行ずつ』ではなく『列方向に1セルずつ』の値を取得してますよね?
これって目的とあっているのでしょうか?
    • good
    • 0

変数vからセルの値を取り出して文字列にすることは可能?

    • good
    • 0
この回答へのお礼

すいません、やり方が分かりません...

お礼日時:2020/09/24 17:19

Object型は全てのクラスの基底クラスだからObject型なのはわかってる



Dim strINSERTの所でブレークポイント止めて
vかxlup.value所にマウス当てたら型が分るから

予想
xlup.valueがナントカrowcollectionでvがナントカrow
    • good
    • 0
この回答へのお礼

Dim strINSERTの所でブレークポイント止めて
vかxlup.value所にマウス当てたら型が分るから
→xlup.valueにカーソルを当てるとxlSheet.Range("A4:V4", xlSheet.Range("A" & xlApp.Rows.Count).End(Excel.XlDirection.xlUp)).Value = {Length=74228}

vにカーソルを当てるとNothingと出ます。

お礼日時:2020/09/24 17:18

SQLserverだったらManegementStudio開いてinsertを実行することができると思うけどそれはやったん?



質問文の4行目以降を
strINSERT=成功したクエリ文
に置き換えて実行することは可能?

可能だとしたら繰り返し変数のvをクエリ文字列にする方法がわからんってこと?
VisualStudioでvの型見て文字列にする方法聞こうや

vの型教えてくれ
予想
strINSERT= strINSERT & v.cells[0].value
strINSERT= strINSERT & v.cells[1].value
みたいな感じで続くけど不正確
質問文の情報からvの型予想するのめんどい
    • good
    • 0
この回答へのお礼

質問文の4行目以降をstrINSERT=成功したクエリ文に置き換えて実行することは可能?
→可能です。以前は普通のfor文でDB登録出来ていたのですが、設計ミスで致命的なバグが見つかったので、今回の箇所を修正する運びになりました。

vの型教えてくれ
→オブジェクト型です。(for each文の上にDim v As Objectと宣言してます)

お礼日時:2020/09/24 16:56

クエリーが組み立てられないのか?


VBAのコードが書けないのか?

さてどっちなんだろうね

丸投げとは言わんが・・・・
何が分からないノかを自分自身で理解しているのかな・・・
    • good
    • 0
この回答へのお礼

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

SQL文(INSERT)の書き方自体は理解できているので、その辺は問題無いのですが、シンプルにコードが書けない(VBAのコードが書けない)状態です。

SQL文とVBの組み合わせで書くときにいつも混乱してしまうので、どう書けば動いてくれるのか(INSERT出来る書き方ができるのか?)でつまずいてしまいます。。。

お礼日時:2020/09/24 15:59

「VB使いらしい汚えソースだな!EntityFramework使うか、せめてカラム名と値のKeyValuePairからInsert出来るサブ関数くらい作れや!(頑張っておられるのですね。

素晴らしいです。ところで、pgAdminなど他の対話環境からSQL文を実行してみて、正しいInsert文がどうなるか確認はされましたでしょうか?正しいInsert文がわかれば、strINSERTに何を入れれば良いかわかるかと思います。その上で、もし文字列中にシングルクォーテーションやダブルクォーテーションをエスケープする方法がわからないのであれば、新しく質問を建て直すといいと思います。御参考になれば、幸いです。)」
    • good
    • 2
この回答へのお礼

「回答が来たと思えばふざけた訳わからねえ言葉をズラズラ並べやがって、こちとら分からんながらも必死で書いてそれでもわかんねえから質問してんだよこのタコ!分かるんだったら書き方を教えやがれこのタコ!(お忙しいところ回答ありがとうございます。すみません、pgAdminが何かすらよく分かっておりません。因みにDBはSQL Serverです。MsgBoxでちゃんと読み取れていることは確認できているのですが、、、。ご丁寧に教えて頂いておるのに、私の理解が乏しくすいません)

お礼日時:2020/09/24 15:56

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

このQ&Aを見た人はこんなQ&Aも見ています