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

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

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

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

マクロ

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

Q&A

解決済

3回答

3451閲覧

Excelマクロで特定シートの情報からSQL文を作成したい

yontabaru

総合スコア19

VBA

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

マクロ

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

0グッド

0クリップ

投稿2018/10/16 02:58

はじめまして。超初心者です。

ブック内に、1シート目に「変更履歴」、2シート目に「テーブル名」という2シートがあります。
複数のブック内の、2シート目「テーブル名」が書かれたシートのみをブック事に読み込んでSQLを作成したくて
いろいろと試してみましたが、2シート目の「テーブル名」だけは取得できてもシート内の項目などが取得できませんでした。

現在は、1シート目に「変更履歴」を削除して、「テーブル名」シートだけにして対応していますが、
できればマクロの方で対応したいので、2シート目の情報でSQLを作成する方法を教えてください。

Sub CREATE_TABLEのSQL作成()

Dim dstSheet As Worksheet Set dstSheet = ThisWorkbook.Worksheets(1) Dim Path As String Path = Range("B13").Value & "\"  ←読み込むExcelファイルの場所を記載しています。 '入力のExcelファイル(テーブル項目)へのパス Dim buf As String buf = Dir(Path & "*.xls") Dim srcBook As Workbook Dim srcSheet As Worksheet '出力先ファイル(全テーブル分のCreate Table文)へのパス Dim fn As Integer fn = FreeFile Dim Output As String Output = dstSheet.Range("B16").Value  ←出力するSQLファイルの場所を記載しています。 'SQL文の出力先ファイル Open Output & "\All_Create_Table.sql" For Output As #fn Dim i As Long Do While buf <> "" i = i + 1 Set srcBook = Workbooks.Open(Path + buf) Set srcSheet = srcBook.Worksheets(1)  ← これを”2”にすると2シート目の名前は取得できました。でも、シート内の情報は取れませんでした。 Dim sheets_name As String sheets_name = srcSheet.Name Call sakuseisql_detail(fn, sheets_name) srcBook.Close False buf = Dir() Loop Close #fn

End Sub

Function sakuseisql_detail(ByRef fn, ByRef sheets_name)
On Error GoTo errorend
Dim iPk As Integer
Dim irow As Integer
Dim intkara As Integer
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim stlen As Integer
Dim bolcomma As Boolean
Dim strPK As String
Dim strcolumn As String
Dim IDENTITY As Integer
Dim strName As String
Dim strtype As String
Dim strketa As String
Dim strNN As String

'PKの列 iPk = 5 'テーブルのカラム数(項目名称の個数:2列目) irow = Cells(Rows.Count, 2).End(xlUp).Row bolcomma = False strPK = "" Print #fn, "CREATE TABLE [dbo]." & Trim(sheets_name) & " (" ←この行だけはうまく取得できるが、以下の情報が取得できません… For i = 6 To irow strName = Trim(Cells(i, 2).Value) strtype = Trim(Cells(i, 3).Value) strketa = Trim(Cells(i, 4).Value) strPK = Trim(Cells(i, iPk).Value) strNN = Trim(Cells(i, 6).Value) '項目名' Print #fn, strName; '型とサイズ' Print #fn, " " & strtype & "(" & strketa & ")"; 'PKの有無チェック If strPK <> "" Then Print #fn, " PRIMARY KEY"; End If 'NOT NULL制約有無のチェック If (strNN = "×") Then Print #fn, " NOT NULL"; End If If i = irow Then Print #fn, vbCrLf & ")" Else Print #fn, "," End If Next i Print #fn, Print #fn,

errorend:
End Function

どのようにしたら2シート目の情報からSQLを作成できるのでしょうか。

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

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

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

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

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

guest

回答3

0

ベストアンサー

前の方の同じ意見ですが、前の方の修正を行っても、まだ、Activeシートに頼るところがあります。
Path = Range("B13").Value & ""  ←読み込むExcelファイルの場所を記載しています。
irow = Cells(Rows.Count, 2).End(xlUp).Row
上記の箇所も修正が必要です。完全に修正したものが、以下のソースです。

VBA

1Option Explicit 2 3Sub CREATE_TABLEのSQL作成() 4 5 Dim dstSheet As Worksheet 6 Set dstSheet = ThisWorkbook.Worksheets(1) 7 8 Dim Path As String 9 Path = dstSheet.Range("B13").Value & "\" '←読み込むExcelファイルの場所を記載しています。 10 11 '入力のExcelファイル(テーブル項目)へのパス 12 Dim buf As String 13 buf = Dir(Path & "*.xls") 14 15 Dim srcBook As Workbook 16 Dim srcSheet As Worksheet 17 18 '出力先ファイル(全テーブル分のCreate Table文)へのパス 19 Dim fn As Integer 20 fn = FreeFile 21 Dim Output As String 22 Output = dstSheet.Range("B16").Value '←出力するSQLファイルの場所を記載しています。 23 24 'SQL文の出力先ファイル 25 Open Output & "\All_Create_Table.sql" For Output As #fn 26 27 Dim i As Long 28 Do While buf <> "" 29 i = i + 1 30 31 Set srcBook = Workbooks.Open(Path + buf) 32 Set srcSheet = srcBook.Worksheets(2) '← これを”2”にすると2シート目の名前は取得できました。でも、シート内の情報は取れませんでした。 33 34 Call sakuseisql_detail(fn, srcSheet) 35 36 srcBook.Close False 37 buf = Dir() 38 39 Loop 40 Close #fn 41End Sub 42 43Function sakuseisql_detail(ByRef fn, ByVal ws As Worksheet) 44 On Error GoTo errorend 45 Dim iPk As Integer 46 Dim irow As Integer 47 Dim intkara As Integer 48 Dim i As Integer 49 Dim j As Integer 50 Dim k As Integer 51 Dim stlen As Integer 52 Dim bolcomma As Boolean 53 Dim strPK As String 54 Dim strcolumn As String 55 Dim IDENTITY As Integer 56 Dim strName As String 57 Dim strtype As String 58 Dim strketa As String 59 Dim strNN As String 60 'PKの列 61 iPk = 5 62 63 'テーブルのカラム数(項目名称の個数:2列目) 64 irow = ws.Cells(Rows.Count, 2).End(xlUp).Row 65 66 bolcomma = False 67 strPK = "" 68 69 Print #fn, "CREATE TABLE [dbo]." & Trim(ws.Name) & " (" '←この行だけはうまく取得できるが、以下の情報が取得できません… 70 71 For i = 6 To irow 72 strName = Trim(ws.Cells(i, 2).Value) 73 strtype = Trim(ws.Cells(i, 3).Value) 74 strketa = Trim(ws.Cells(i, 4).Value) 75 strPK = Trim(ws.Cells(i, iPk).Value) 76 strNN = Trim(ws.Cells(i, 6).Value) 77 78 '項目名' 79 Print #fn, strName; 80 81 '型とサイズ' 82 Print #fn, " " & strtype & "(" & strketa & ")"; 83 84 'PKの有無チェック 85 If strPK <> "" Then 86 Print #fn, " PRIMARY KEY"; 87 End If 88 89 'NOT NULL制約有無のチェック 90 If (strNN = "×") Then 91 Print #fn, " NOT NULL"; 92 End If 93 94 If i = irow Then 95 Print #fn, vbCrLf & ")" 96 Else 97 Print #fn, "," 98 End If 99 Next i 100 101 Print #fn, 102 Print #fn, 103 104errorend: 105End Function 106

投稿2018/10/16 04:59

tatsu99

総合スコア5438

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

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

yontabaru

2018/10/16 05:24

各出力項目にも、対象シートを指定するのを忘れていました。 言われてみれば、そうだ~!という感じでした。 おかげさまで、無事に出力できました。 お忙しいところありがとうございました!!
guest

0

sakuseisql_detailの中が対象とするブック・シートを特定していないからでしょう。
折角ワークシートオブジェクトを取得しているのだから、シート名を渡すのではなく、シートオブジェクトそのものを渡したほうがよいかと思います。

VBA

1 Set srcBook = Workbooks.Open(Path + buf) 2 Set srcSheet = srcBook.Worksheets(1) 3 Call sakuseisql_detail(fn, srcSheet) 4~省略~ 5Function sakuseisql_detail(ByRef fn, sheet as Worksheet) 6~省略~ 7 Print #fn, "CREATE TABLE [dbo]." & Trim(sheet.Name) & " (" 8 9 For i = 6 To irow 10 strName = Trim(sheet.Cells(i, 2).Value) 11 strtype = Trim(sheet.Cells(i, 3).Value) 12 strketa = Trim(sheet.Cells(i, 4).Value) 13 strPK = Trim(sheet.Cells(i, iPk).Value) 14 strNN = Trim(sheet.Cells(i, 6).Value)

基本的にVBAではアクティブ(ブック・シート)前提の作りは破綻しやすいのでお勧めしません。

投稿2018/10/16 04:18

ttyp03

総合スコア16998

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

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

yontabaru

2018/10/16 04:58

お時間いただいてありがとうございます。 Set srcBook = Workbooks.Open(Path + buf) Set srcSheet = srcBook.Worksheets(2) ← 2シート目が欲しいので、”2”にしました。 Call sakuseisql_detail(fn, srcSheet) ←シート自体を渡す。 ~省略~ Function sakuseisql_detail(ByRef fn, sheet as Worksheet) ←シート自体をもらう。 ~省略~ Print #fn, "CREATE TABLE [dbo]." & Trim(sheet.Name) & " (" for i = 6 To irow : と変更してみましたが、出力ファイルには、   Print #fn, "CREATE TABLE [dbo]." & Trim(sheet.Name) & " (" の部分のみしか出力されず、For文以下が出力されません。 なぜでしょうか・・・ 【出力結果】 CREATE TABLE [dbo].TB_AAA ( CREATE TABLE [dbo].TB_BBB ( CREATE TABLE [dbo].TB_CCC (      :
ttyp03

2018/10/16 05:01

irow を求めるところにもsheetを使う必要がありました。 irow = sheet.Cells(sheet.Rows.Count, 2).End(xlUp).Row 他にもあるかもしれないので見直してみてください。
yontabaru

2018/10/16 05:30

お忙しいところありがとうございました。 ご指摘の通り、 irowを求めるところ、各項目を取得している、Cells()を使用している所に、 折角受け取ったシートを指定していませんでした。 sheet.Cells(....とCellsを使用しているところすべてに受け取ったパラメータを指定したら、正しく出力されるようになりました。 ありがとうございました。 これからもよろしくお願いします。
guest

0

sakuseisql_detail内のCellsが読み込んでるBookではなく、このマクロが書かれているBookのセルを見にいってるのではないでしょうか。

VBA

1With ActiveWorkbook.Sheets(sheets_name) 2 strName = Trim(.Cells(i, 2).Value) 3 strtype = Trim(.Cells(i, 3).Value) 4 strketa = Trim(.Cells(i, 4).Value) 5 strPK = Trim(.Cells(i, iPk).Value) 6 strNN = Trim(.Cells(i, 6).Value) 7End With

※動作確認はしてないです。

投稿2018/10/16 03:20

kobac

総合スコア188

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

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

yontabaru

2018/10/16 05:31

お忙しいところありがとうございました。 他の方のご指摘の通り、修正することで解決しました。 今後もよろしくお願いします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問