[[20070918130314]] 『解決?!エクセルVBAでエクセルファイル読み込まax(guaidao) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『解決?!エクセル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.