• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:指定したExcelをSQLテーブルに呼び込むには)

指定したExcelをSQLテーブルに呼び込む方法

NoMusicNoLife49の回答

回答No.7

こんにちは。 前回のソースの >Fill(DT) >End With の直下に以下のソースをコピーしてください。(*最後に重要な説明が書きましたので必ず読んでください。 '↓ここから '変数宣言 Dim DB接続クラス As System.Data.SqlClient.SqlConnection = Nothing Dim SQL実行クラス As System.Data.SqlClient.SqlCommand = Nothing Dim トランザクション As System.Data.SqlClient.SqlTransaction = Nothing '※データベースに接続するためのUser IDとPasswordを指定してください。 Dim strDB接続情報 As String = "Data Source=WS70;" & _ "Initial Catalog=勤怠管理;" & _ "Persist Security Info=True;" & _ "User ID=ID;" & _ "Password=Pass;" Try 'DB接続クラスインスタンス作成 DB接続クラス = New SqlConnection(strDB接続情報) 'DB接続 DB接続クラス.Open() 'トランザクション開始 トランザクション = DB接続クラス.BeginTransaction 'SQLコマンド実行クラス作成 SQL実行クラス = New SqlCommand With SQL実行クラス 'パラメータ初期化 .Parameters.Clear() 'DB接続情報設定 .Connection = DB接続クラス 'トランザクション指定 .Transaction = トランザクション 'コマンドタイプ設定 .CommandType = CommandType.Text 'SQLコマンド設定 .CommandText = "INSERT INTO SELECT @No,@氏名,@国語,@数学,@英語,@合計点" 'I/Oパラメータ定義 .Parameters.Add("@No", SqlDbType.Int).Direction = ParameterDirection.Input .Parameters.Add("@氏名", SqlDbType.NVarChar, 8).Direction = ParameterDirection.Input .Parameters.Add("@国語", SqlDbType.Int).Direction = ParameterDirection.Input .Parameters.Add("@数学", SqlDbType.Int).Direction = ParameterDirection.Input .Parameters.Add("@英語", SqlDbType.Int).Direction = ParameterDirection.Input .Parameters.Add("@合計点", SqlDbType.Int).Direction = ParameterDirection.Input 'SQL実行ループ For Each DR As DataRow In DT.Rows Try 'エクセルのデータをSQL実行パラメータに設定 .Parameters.Item("@No").Value = DR(0) .Parameters.Item("@氏名").Value = Convert.ToString(DR(1)) .Parameters.Item("@国語").Value = DR(2) .Parameters.Item("@数学").Value = DR(3) .Parameters.Item("@英語").Value = DR(4) .Parameters.Item("@合計点").Value = DR(5) 'SQL実行 .ExecuteNonQuery() Catch ex As SqlException 'SQL例外処理部 'SQL実行時にエラーが発生した場合、このブロックに飛びます。 'エラーメッセージ出力 MsgBox(ex.Message & ex.StackTrace, MsgBoxStyle.Critical) End Try Next End With 'コッミト トランザクション.Commit() Catch ex As Exception '例外処理部 'ロールバック トランザクション.Rollback() 'エラーメッセージ出力 MsgBox(ex.Message & ex.StackTrace, MsgBoxStyle.Critical) Finally If DB接続クラス IsNot Nothing AndAlso DB接続クラス.State <> ConnectionState.Closed Then 'DB接続切断 DB接続クラス.Close() End If End Try '↑ここまで ※-------------------------------- ※ ※----------- 重要 ---------------- ※ ※-------------------------------- ※ ソースの前半で >'※データベースに接続するためのUser IDとPasswordを指定してください。 > Dim strDB接続情報 As String = "Data Source=WS70;" & _ > "Initial Catalog=勤怠管理;" & _ > "Persist Security Info=True;" & _ >"User ID=ID;" & _ >"Password=Pass;" の >"User ID=ID;" & _ >"Password=Pass;" の 「ID」と「Pass」をデータベース「勤怠管理」に接続するためのIDとPassに書き換えてください。

10071007
質問者

お礼

NoMusicNoLife49 さん続いてありがとうございます。 本当に細かく教えていただいてありがとうございます。 私も私なりに考えてNoMusicNoLife49のプログラムを下敷きに作ってみました。 <--- 追加 という所が追加したプログラムです。 勤怠管理DataSetをフォームに貼付けテーブルとつながった状況で With OleAdapter .SelectCommand = New OleDb.OleDbCommand .SelectCommand.Connection = OleConnection .SelectCommand.CommandType = CommandType.Text .SelectCommand.CommandText = "SELECT * FROM [sheet1$]" 'エクセルファイルのデータをメモリーテーブルに読込む .Fill(DT) Dim str確認メッセージ As String = String.Empty If DT.Rows.Count = 0 Then MsgBox("エクセルのデータを取得できませんでした。") Else 'テーブルデーター削除 Call テーブルデーター削除() <---追加 'データーを取込 For Each DR As DataRow In DT.Rows str確認メッセージ = String.Empty Dim 氏名 As String = "" 順番 = 1 For Each obect As Object In DR.ItemArray If obect IsNot DBNull.Value = True Then DataPub(順番) = "'" & Convert.ToString(obect) & "'"  <--- 追加 'MsgBox(順番 & Data(順番)) str確認メッセージ += "|" + Convert.ToString(obect) End If 順番 = 順番 + 1 Next MsgBox(str確認メッセージ) 'テーブルデーター書込 Call テーブルデーター書込() <---追加 Next End If End With 追加したプロシージャーは2つあります。 1つ目のプロシージャー Private Sub テーブルデーター削除() 'コネクション指定 Using Connection As New _ SqlClient.SqlConnection(My.Settings.処理数ConnectionString) 'コマンド定義 Dim command As SqlClient.SqlCommand = Connection.CreateCommand() 'コネクションを開く Connection.Open() 'コマンド定義と実行 command.CommandText = _ "TRUNCATE TABLE dbo.test" 'commandを実行 command.ExecuteNonQuery() 'コネクションをclose Connection.Close() End Using End Sub 2つ目のプロシージャー Private Sub テーブルデーター書込() 'コネクション指定 Using Connection As New _ SqlClient.SqlConnection(My.Settings.処理数ConnectionString) 'コマンド定義 Dim command As SqlClient.SqlCommand = Connection.CreateCommand() 'コネクションを開く Connection.Open() 'コマンド定義と実行 command.CommandText = _ "INSERT INTO dbo.test(NO,氏名,国語,数学,英語,合格点) SELECT" & DataPub(1) & "," & DataPub(2) & "," & DataPub(3) & "," & DataPub(4) & "," & DataPub(5) & "," & DataPub(6) 'commandを実行 command.ExecuteNonQuery() 'コネクションをclose Connection.Close() End Using End Sub これで何とか書き込めました。 このプログラムでどこかアドバイスなりありましたらお願いいたします。 本当に細かく教えていただいてありがとうございます。 よろしくお願いいたします。

関連するQ&A

  • アクセス2000→エクセル2010へエクスポート

    Private Sub cmd出力ボタン_Click() DoCmd.SetWarnings False DoCmd.TransferSpreadsheet acExport, 8, "出力クエリ", "C:データ.xlsx", True, "" DoCmd.SetWarnings True End Sub 実行すると 外部テーブルのフォーマットが正しくありません と出てしまいます。 エクセル97の形式にエクスポートする際は大丈夫でした。 spreadsheettypeの引数が違うのかとは思いますが適切な数値がわかりません。 他のやり方等もあれば教えて下さい。

  • access一部のフィールドを他のテーブルへVBA

    先日 https://okwave.jp/qa/q10245651.html において > table2の新しいデータとして > table1のデータをコピーしたい、 単に追加で ということであれば、という 御回答: Sub Test() Dim StrSQL As String StrSQL = "INSERT INTO table2 SELECT table1.* FROM table1;" DoCmd.SetWarnings False DoCmd.RunSQL StrSQL DoCmd.SetWarnings True End Sub ---------------------- 上記の 回答をいただき うまく稼働しました 部分的にフィールドを別テーブルに 移動するとき ここでは table1のフィールド名 IDに table2のフィールド名 bに 入っている数値 にい 1を加えた数値を 移動したいのですが Public Function Test() Dim tb1 As Table Dim tb2 As Table tb1 = table1 tb2 = table2 Dim strSQL As String strSQL = "INSERT INTO table2![ID]SELECT"("[b]"FROM tablel)+1" (table1のフィールド[b]の数値に1を加えた数値を table2のフィールド[ID]に移行する、というつもりです) DoCmd.SetWarnings False DoCmd.RunSQL strSQL DoCmd.SetWarnings True End Function 稼働しません すみません 宜しくお願い致します (ついでながら ここで でてくるb というのは テーブル table3 の IDの総和 すなわち SELECT Count(table3.ID) AS b FROM table3; 要は table3の最後のレコードの次のレコードの 番号の数値を table2のIDに移動したい というわけであります) (いずれのIDや bについても 数値型 長整数型 重複あり です)

  • EXCELファイルからACCESSへインポート

    質問させていただきます。 ACCESSのフォームから、EXCELファイルを選択してEXCELの内容を、 テーブルにインポートさせたいのですが。以下の方法で行って いるのですが、テーブルに反映されません。 Private Sub cmd_Import_Click() Dim InitialFileName As String Dim varTitle As Variant Dim FileName As String InitialFileName = "hoge.xls" varTitle = "ファイルを開く" FileName = GETHOGEOPEN(varTitle, InitialFileName) DoCmd.SetWarnings False DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "T_HOGE", FileName, True DoCmd.SetWarnings True MsgBox "完了しました" End Sub ACCESS → ACCESS2003 SP3 EXCEL →EXCEL2003 SP3 よく見ると、すでにEXCELのバージョン指定が違う(汗) これが原因かも・・・・(汗) わかる方がいらっしゃったら教えてください。

  • アクセス2007 テーブルの全削除とデータ移動

    アクセス2007 テーブルの全削除とデータ移動 全テーブルを削除して、データをインポートしようとしています。 質問1. 下記のコードで、リレーションの張ってあるテーブルの削除でエラーになります。 でも、DoCmd.SetWarnings Falseの状態で、手動で削除するとエラーになりません。 だったらと思い、コードにDoCmd.SetWarnings Falseを追加したのですが、やはりエラーになります。 対処法はないでしょうか? 質問2. テーブルの中に「~TMP******」という勝手に作られたテーブルは、削除してもいいものなのでしょうか? 質問3. 削除後にインポートをしたいのですが。 手動でアクセスメニュー>外部データ>アクセス(のインポート)>現在の~~>すべて選択(テーブル)>OK これを実現するVBの記述は、どんなコードになるのでしょうか? --------------------------------------------------------------------- Private Sub 旧バージョンからデータ移動_Click() Dim i As Integer Dim tbls As DAO.TableDefs Dim tbl As DAO.TableDef '開いているフォーム全てを閉じる For i = Forms.Count - 1 To 0 Step -1 DoCmd.Close acForm, Forms(i).Name Next i Set tbls = CurrentDb.TableDefs DoCmd.SetWarnings False  '追加-------------------    ’全テーブル削除 For Each tbl In tbls If InStr(1, tbl.Name, "MSys", vbBinaryCompare) = 0 And InStr(1, tbl.Name, "~TMP", vbBinaryCompare) = 0 Then tbls.Delete (tbl.Name) End If Next DoCmd.SetWarnings True   '追加----------------   ’旧バージョンからのデータインポート   ’VBコードがわかりません End Sub ------------------------------------------------------------------------- ※旧バージョンとはアクセス本体ではなく、自分でつくったDBの旧バージョンです。 複数質問で申し訳ありませんが、よろしくお願い致します。

  • Accessクエリ実行時のメッセージ表示について

    クエリ実行時にメッセージが表示されるのが面倒なので以下のようにしました DoCmd.SetWarnings False クエリ実行 DoCmd.SetWarnings True こうするとメッセージが表示されなくなりますが、他の箇所 (テーブルを開いてデータを削除とか、フォームの削除とか) でもメッセージが出なくなってしまいます。 他のところではメッセージが出るようにしたいのですが… また、一度mdbを閉じて開きなおすと、ちゃんと出ます

  • sqlについて

    SQLについて質問です。 VBからMDBにSQLでデータの参照をしたいのですが ("select * from abc where No = " & No & " ;") テーブル内の数ある項目の中で一つだけまたは複数除いて参照する場合のSQL文を教えてください。 項目が60個ほどありますので一つ一つ指定していくとすごく長いSQLになってしまいそうですのでお知恵をお貸しください><

  • VBA内でSQL(UPDATEをループ処理)したいのですが

    アクセスを使って UPDATE 在庫計画 SET 在庫計画.2 =[1]-[2]; 在庫計画・・・テーブル名 1・・・フィールド名  ・・・1の在庫数 2・・・フィールド名  ・・・2の払出し数 上記のSQLで 2の払出し数を在庫数に更新して 在庫予測をします。 テーブルには、3,4,5・・・30,31のフィールド(払出し数)があります。 UPDATE 在庫計画 SET 在庫計画.3 =[2]-[3]; のように更新クエリを次々作って3,4,5・・・の在庫予測数に 更新して行くのは大変なので VBA内でSQLを実行する方法を教えてください。 FOR NEXT を用いてループを組んでいけば良いのでしょうが VBAの知識が無く困っています。

  • oracle(SQL)のHINT指定について

    性能問題について対応しています。 約2000万件のマスタと付随する各テーブルを結合して、検索条件に一致するデータを抽出するSQLを開発していますが、これらのパターン(曖昧検索:前方一致)において、前述の2000万件のマスタが駆動表となり、且つフルスキャンが走るものがあり、改善策を検討しています。 つきましては、HINT指定で駆動表を強制的に各テーブルに変更する方法(SQLのHINT指定内容)についてお教え願います。  →曖昧検索条件にもっとも絞られる対象のテーブルを駆動表とし、マスタテーブルはその駆動表とプライマリーキーで結合した形でアクセス(フルスキャンを避ける)ような実行計画となるSQLに改善をしようとしています。 以上です。 

  • SendKeyで解決できないでしょうか?

    こんにちは。どうぞ、よろしくお願いします。 テーブル作成のクエリに関することです。 コマンドボタンのクリック時のイベントに テーブル作成クエリを指定しています。 其の場合、以下のような確認のダイアログボックスが出ますが、 これを出ないように、出来ないものでしょうか? (2つのダイアログボックス共に、"Y"を押下します。)   テーブル作成クエリを実行すると、   新しくテーブルが作成されます。   **** 件のレコードが新規テーブルにコピーされます。 -------------- クリック時のイベントに付いてですが、 SendKeyを使ってみましたが、上手く行きませんでした。 SendKeyはアクティブウィンドウについて作用するとのことなので、 フォームを閉じて…、などを考えて、次のような感じでやりました。 DoCmd.Close acForm, "フォーム名" DoCmd.DeleteObject acTable, "テーブル名" DoCmd.OpenQuery "作成クエリ", acNormal, acEdit SendKeys "y", True SendKeys "y", True DoCmd.OpenForm "フォーム名" DoCmd.DeleteObjectは、 テーブルを削除していないと上書きするかどうかを聞いてくるので、 削除しておこうと思い書きました。SendKeyでは、可能に出来ないのでしょうか? DoCmd.SetWarnings False も少し試しましたが、違うようですし。 それとも、簡単には解決できないようなことでしょうか。どうぞ、お願いします。

  • アクセスVBAのSQLについて

    (1)テキストファイルに記述したSQL文のセットをVBAで実行するコマンドはありますか? (2)テーブルを作成する際の、DB指定は 「create table "DB名"."テーブル名"…」としたらよいでしょうか (3)"DB名". を省略できるのはどのような場合ですか? (4)Docmd.RunSQL "" で一度に複数のSQL文を実行できますか? よろしくお願いします。m(_ _)m