[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『解決?!エクセルVBAでエクセルファイル読み込ませてSQLファイルに転記させるには』(guaidao)
同じ質問で申し訳ありません。 まだわからないことがありますので 新たに質問させて頂きます。 下記のコードは、ブックを選び、 選んだファイルをSQL文に変換するという コードなのですが、 SQLファイルは作られても、その中身が 転記されず、原因がわからないので 困っています。 何かが間違っているのか、 記述が足りないのか、 教えていただけないでしょうか?
Sub CreateTable() '******************************************** ' Create SQL '******************************************** Dim TableName As String 'テーブル名称 Dim TableId As String 'テーブルID Dim FieldName As String 'フィールドID Dim FieldType As String 'フィールドタイプ Dim FieldLength As String 'フィールド桁 Dim FieldPoint As String 'フィールド少数 Dim NotNull As String 'Not Null Dim Default As String 'Default Dim FieldCom As String '備考 Dim FileName As String 'SQL出力ファイル名(*.sql) Dim SQLString As String Dim i_sheet As Integer Dim i_row As Integer Dim i_col As Integer Dim ValueToFind As Integer Dim NotFound As Boolean Dim SizeScale As String Dim FieldNum As Integer Dim wb As Workbook Dim ws As Worksheet Dim opwb As String Dim wbnm As String Dim mypath As String Dim sw1 As Long Dim hantei As Boolean
'***************************************** ' Create Table '*****************************************
opwb = Application.GetOpenFilename(Title:="ファイル開く", FileFilter:="Excel ファイル(*.xls),*.xls")
If opwb = "False" Then Exit Sub wbnm = Dir(opwb) hantei = True For Each wb In Workbooks If wb.Name = wbnm Then hantei = False Exit For End If
Next wb If hantei = True Then Workbooks.Open opwb Set wb = Workbooks(wbnm)
For i_sheet = 1 To Sheets.Count Worksheets(Sheets(i_sheet).Name).Activate
TableName = Cells(4, 2).Value 'テーブル名称 mypath = CurDir() FileName = TableName & ".sql" 'テーブル名称.sqlというファイル名でsqlを作成する。 Open FileName For Output As #1 TableId = Cells(4, 7).Value 'テーブルID SQLString = "Create Table " & TableId & " (" 'Create Table文開始 Print #1, SQLString i_row = 7 'フィールド定義の開始行 FieldNum = 0 FieldName = Cells(i_row, 5).Value 'フィールドID
Do While FieldName <> "" If i_row <> 7 Then SQLString = SQLString & "," Print #1, SQLString End If
FieldType = Cells(i_row, 6).Value 'フィールド属性 If Len(FieldName) < 8 Then SQLString = Chr(9) & FieldName & Chr(9) & Chr(9) & Chr(9) & FieldType Else If Len(FieldName) < 16 Then SQLString = Chr(9) & FieldName & Chr(9) & Chr(9) & FieldType Else SQLString = Chr(9) & FieldName & Chr(9) & FieldType End If End If Print #1, SQLString If FieldType = "Nvarchar" Or FieldType = "Numeric" Or FieldType= "varchar" Or FieldType = "char" Then FieldLength = Cells(i_row, 8) 'フィールド桁数 FieldPoint = Cells(i_row, 9) '少数点 If FieldPoint <> "" Then SQLString = SQLString & "(" & FieldLength & "," & FieldPoint & ")" Else SQLString = SQLString & "(" & FieldLength & ")" End If Else SQLString = SQLString & Chr(9) End If Print #1, SQLString NotNull = Cells(i_row, 10).Value 'Null制約 If NotNull = "●" Then SQLString = SQLString & Chr(9) & "Null" Else SQLString = SQLString & Chr(9) & "Not Null" End If
Default = Cells(i_row, 11).Value 'Default If Default <> "" Then SQLString = SQLString & Chr(9) & "Default " & Default End If
FieldNum = FieldNum & 1 i_row = i_row & 1 FieldName = Cells(i_row, 5).Value 'フィールドID Loop
Print #1, SQLString Print #1, ""
'********************************************** ' PrimaryKey '********************************************** i_row = 7 'フィールド定義の開始行 i_col = 3 'Index定義の開始列 sw1 = 0
FieldName = Cells(i_row, 5).Value 'フィールドID
Do While FieldName <> "" If Cells(i_row, i_col).Value = "●" Then If sw1 = 0 Then SQLString = Chr(9) & "CONSTRAINT PMK_" & TableId & " PRIMARY KEY ONCLUSTERED" SQLString = SQLString & Chr(13) & Chr(10) & Chr(9) & "(" Print #1, SQLString sw1 = 1 Else SQLString = SQLString & "," Print #1, SQLString End If SQLString = Chr(9) & FieldName End If i_row = i_row + 1 FieldName = Cells(i_row, 5).Value 'フィールドID Print #1, SQLString Loop
If sw1 = 1 Then Print #1, SQLString SQLString = Chr(9) & ")" Print #1, SQLString Print #1, "" End If
'********************************************** Print #1, ")" Print #1, "Go" Print #1, ""
'********************************************** ' Index '********************************************** i_row = 7 'フィールド定義の開始行 i_col = 4 'Index定義の開始列 sw1 = 0
FieldName = Cells(i_row, 5).Value 'フィールドID
Do While FieldName <> "" If Cells(i_row, i_col).Value = "●" Then If sw1 = 0 Then SQLString = "Create Index " & TableId & "_INDEX_01" & " On " & TableId SQLString = SQLString & Chr(13) & Chr(10) & Chr(9) & "(" Print #1, SQLString sw1 = 1 Else SQLString = SQLString & "," Print #1, SQLString End If SQLString = Chr(9) & FieldName End If i_row = i_row & 1 FieldName = Cells(i_row, 5).Value 'フィールドID Loop
If sw1 = 1 Then Print #1, SQLString SQLString = Chr(9) & ")" Print #1, SQLString Print #1, "Go" Print #1, "" End If
Print #1, "GRANT SELECT, INSERT, UPDATE, DELETE ON " & TableId & " TO db_user" Print #1, "Go"
Close #1
Next i_sheet
Set wb = Nothing Set ws = Nothing
End Sub
前回のアドバイスがまるで反映されていないのですが、ちゃんと試したのでしょうか? (tomo)
こんにちは。 ブックをひとつずつ選び SQLファイル作成というのは、 前回のアドバイスのまましたので、 上記のコードで可能になりました。 ただセルの中身が転記されません。 前回に、 tomoさんが書き込んでくださった、 短いコードや最後の長めコードが 全てエラーになってしまい それらの原因もわからない次第なので 再び質問させた頂きました
(guaidao)
すいません、少し語弊がありました。 前回にtomoさんが最後に書き込みして頂いた 少し長めのコードは、 ちゃんと動くのですが、 やはりエクセルファイルの中身が 転記されない状況でした。
(guidao)
短い方が動かないのはおかしいです。 長い方のコードの最初の方だけを抜き出して作成しただけなので、 短い方が動かなければ、長い方も動かないはずです。 短い方は全コードをコピペして、一度保存してから実施したのでしょうか? それでも出る場合、どのコードでエラーが起きるのか、教えて下さい。 (tomo)
再度試してみましたが、
実行時エラー1004 アプリケーションの定義またはオブジェクトのエラー
となります。 コードのエラーの場所は何も指し示す印が無いので、 どこかのコードの部分のエラーなのかが わかりません。申し訳ないです
(guaidao)
エラーのウィンドウがでたら、デバックボタンを押してください。 黄色の行が表示されると思います。その行を教えて下さい。 (tomo)
時間がないのでざっと見ただけですが... Output だと上書きしますよね? Append じゃ無いのですか? (seiya)
エラーが出るときと、出ないときがありますが、 一応短いコードも動きました。 エラーが出たときの黄色い行は 一番上の
Sub Createtable()
のところです。 ちなみに、最終的に選んだフォルダの中にある エクセルファイルをLoopさせて 全てSQL文にするという方向に持っていくので、 たぶん上書きでも大丈夫だと思います。
(guaidao)
何度もですが、もう一度確認です。 新規ブックの標準モジュールにコピペで、保存してから実行したのですよね? それと一度、デバック(D)のコンパイルを実行してみてください。 ひょっとして、これでエラーになりますか? (tomo)
追記です。 エラーが出るときと、出ないときがある を解決する方法です。(きっとですが・・・) '***************************************** ' Create Table '***************************************** Close とDimの直後でも構いません。"Close"を入れてください。
言い忘れました。 短い方ですが、開くブックの名前はBook1.xlsとなっています。 セルB4にsqlファイル名 セルA4テーブルID の用意が必要です。
なお、長い方ですが、こちらではシート構成が分らないので、 Printで書き込むセルの内容を確認できません。 実はコードはおかしくなくて、ひょっとしたら空白セルを参照しているとか・・・ その辺も、一度確認されては・・・ (tomo)
おはようございます! tomoさん何度もありがとうございます。
Book1はこちらのファイル名に変えてやっていました^^ シートの構成ですが、 変換するエクセルファイルの中身は 個々によって差がありまして、 横が長かったり、縦に長かったりしています。
■シート構成例
No 項目名称 FIELD NAME TYPE 桁数 PK 有効桁数 項目N 説 明 旧項番 1 カテゴリ区分 KB_CATEG char 1 @ 1 「1」 2 カテゴリ1コード CD_CATEG1 char 4 A 3 大 分類 1 3 カテゴリ2コード CD_CATEG2 char 4 B 空 白 4 カテゴリ3コード CD_CATEG3 char 4 C 空 白 5 カテゴリ4コード CD_CATEG4 char 4 D 空 白 6 カテゴリ5コード CD_CATEG5 char 4 E 空 白 7 カテゴリ名称(漢字)CR_KANZIMEI varchar 40 22 大分類名(漢字) 3 8 カテゴリ名称(カナ)CR_KANAMEI varchar 40 9 カテゴリ短縮名称 CR_TANMEI varchar 20 10 レシート品名 CR_KANAREC varchar 40 11 GP グループコード CD_CATGP1 char 4 4 部 門グループマスタで管理 2 12 DS7大分類 CD_CATGP2 char 4 2 5 13 商品管理部門 CD_CATGP3 char 4 3 7 14 税 税区分 KB_ZEI char 1 15 税率 NM_TAX numeric 16 原価率 NM_GENRITU numeric 4.2 8 18 区分 売上モデル区分 KB_KBN01 char 1 1 通 常は4固定 6 19 区分2 KB_KBN02 char 1 20 区分3 KB_KBN03 char 1 21 区分4 KB_KBN04 char 1 22 区分5 KB_KBN05 char 1 23 DM商品コード CD_CODE1 char 10 7 9 24 人事管理部門コード CD_CODE2 char 10 3 10 25 MGPコード CD_CODE3 char 10 2 13 26 コード4 CD_CODE4 char 10 27 コード5 CD_CODE5 char 10 28 アイテム数 NM_DATA1 numeric 4 29 データ2 NM_DATA2 char 30 データ3 NM_DATA3 char 31 更新情報 登録日時 DT_CREATE char 11 32 登録者 CR_CREATE char 10 33 更新日時 DT_UPDATE char 12 34 更新者 CR_UPDATE char 10
■ ■ ■正しく変換されたSQLファイルの場合(例)
Create Table DAT_HATTYU_102 ( DT_NOUHIN char(8) Not Null, CD_SYOHIN char(14) Not Null, CD_EDABAN char(3) Not Null, CD_TENPO char(4) Not Null, KB_BIN char(1) Not Null, RB_NOUHIN char(2) Not Null, DT_HATTYU char(8) Null, DT_HATSIME char(4) Null, NM_TP_HATTYU int Null, NM_HB_HATTYU int Null, NM_HATTYU int Null, NM_HATTYUBARA int Null, KB_TP_SHUSEI char(1) Null, KB_HB_SHUSEI char(1) Null, NM_NOUHIN float Null, CD_TORIHIKISAKI char(6) Null, CR_TORIHIKISAKI varchar(50) Null, KB_ZAIKO char(1) Null, NM_ZAIKO float Null, NM_TEKIZAIKO float Null, NM_HATTANI int Null, CD_HATTANI char(1) Null, CR_HATTANI varchar(10) Null, NM_GENTANKA float Null, NM_CEN_TANKA float Null, NM_BAITANKA int Null, CD_NOUTANI int Null, CR_NOUTANI varchar(10) Null, NM_KOTAI char(30) Null, KB_SIIRETOK char(1) Null, KB_HANBAITOK char(1) Null, NM_GENNAIYO float Null, KB_GENNAIYOTANI char(1) Null, CR_GENNAIYOTANI varchar(10) Null, NM_KANZAN int Null, CD_CATEG1 char(4) Null, CD_CATEG2 char(4) Null, CD_CATEG3 char(4) Null, CD_CATEG4 char(4) Null, CD_CATEG5 char(4) Null, CD_KIGYO char(5) Null, CD_JAN varchar(14) Null, CD_GENTAI char(14) Null, CR_ITEM varchar(60) Null, KB_NEWITEM char(1) Null, NM_LEADTIME int Null, CR_SANTI varchar(30) Null, NM_IRISU int Null, CR_KIKAKU varchar(20) Null, CR_TOUKYU varchar(10) Null, KB_SENTAKU char(1) Null, CD_SINA char(1) Null, CR_SINA varchar(10) Null, CR_TOKUITEM varchar(10) Null, KB_HAISOU char(2) Null, CR_HAISOU varchar(10) Null, CD_TANAJUN varchar(20) Null, CR_JODANMOJI varchar(10) Null, CR_HANKEITAI varchar(30) Null, CR_BIKOU varchar(80) Null, NM_GENTEISU int Null, CD_CENTER varchar(20) Null, CD_CLAIM char(1) Null, KB_TOKUBAI char(2) Null, KB_TIME char(1) Null, CD_TOKNO char(9) Null, KB_DENPYO char(2) Null, KB_POS char(1) Null, CR_KANAITEM varchar(60) Null, NM_INJISEQ int Null, CD_CATGP1 char(4) Null, CR_GENSAN varchar(30) Null, CR_KAKOU varchar(30) Null, CR_SEISAN varchar(30) Null, KB_HINON char(1) Null, KB_SITEI char(1) Null, NM_DEN_NO int Null, NM_DENGYO_NO int Null, NM_NOUHINGENKA int Null, NM_BAIKAKINGAKU int Null, KB_NOUSUI char(1) Null, KB_ICHISYOHIN char(1) Null, KB_ICHIBA char(1) Null, DT_EOSHATTYU char(8) Null, DT_KEIJO char(8) Null, CD_PTN char(6) Null, DT_KEIYU datetime Null, DT_SIWK datetime Null, DT_PRODTEHAI datetime Null, CD_ODROYA char(5) Null, KB_DENGYO char(2) Null, KB_IRYDENFORM char(1) Null, KB_DEN char(2) Null, KB_ODRDATA char(1) Null, KB_ODRDATAATK char(2) Null, KB_BY char(4) Null, KB_NCDATAWATA char(2) Null, KB_TAGDATA char(2) Null, KB_PICKLIST char(2) Null, CR_CNHNSTTM char(4) Null, CR_CNHNEDTM char(4) Null, KB_SORYO char(2) Null, KB_NC_SORYO char(2) Null, CR_KANZITOKUBAI varchar(50) Null, NM_TESURYO float Null, SU_1BNHIRT int Null, SU_2BNHIRT int Null, KB_ODRSSEI int Null, CD_SHIPBUN char(2) Null, CD_TANAOBUN char(2) Null, CD_ITEMBUN char(2) Null, CD_WEKODR char(4) Null, KB_KBN03 char(1) Null, SU_HANTANI int Null, CD_YRDR char() Null, SU_SLODRTANI int Null, CD_ODRCALL char(8) Null, CD_MS2KETA char(2) Null, KB_KYUICHI char(1) Null, NM_TEIBAN_BAIKA int Null, NM_FUKUGENKA float Null, NM_FC_HATTYU int Null
CONSTRAINT PMK_DAT_HATTYU_102 PRIMARY KEY NONCLUSTERED ( DT_NOUHIN, CD_SYOHIN, CD_EDABAN, CD_TENPO, KB_BIN, RB_NOUHIN )
) Go
GRANT SELECT, INSERT, UPDATE, DELETE ON DAT_HATTYU_102 TO db_user Go
シートの構成わかりにくくてすいません^^; SQLファイルは少しばらついた感じですが、 中身の変換に成功するとこういう風になります。 シートの構成は左上のAから始まっています。 変換される中身は FILEDNAME type(charやfloatなど) 桁数(1や5の数字)
の三つだけです。 tomoさんが言われるように位置がずれている可能性も ありそうです。
(guaidao)
こんにちは! tomoさんが教えて頂いてくれたコードと もとのコードを組み合わせて、 ブックを選び、シートをSQLファイルに 転記させることができました。 色々と答えてくれたこと感謝します。 あとは、きちんと転記させたい部分が 転記してくれれば完全解決ですv その辺はセルの位置などが 問題のような感じなので、 何とかまた続きをやってみます。
(guaidao)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.