エクセルブックの中からシート名が"TABLEnnn"(nnnは000から999の間)のものを対象に
データを抽出し、一定の文字列と連結し(SQL文)、同じブックのシートに書き出す処理を考えています。
(DBのTABLEの英語列名、日本語列名、備考欄があるのでそれらを取得・連結し、COMMENT ON文を作成したい)
仕様は以下のとおり考えてみたのですが、
【COMMENT ON作成支援 仕様】
※ブック内の最初のシートに移動
(1) シート名が"TABLEnnn"(nnnは000から999の間)のシート名を取得。
シート『comment_on』に"--シート名"を書き出す。
取得できないとき『終了しました』を出力し終了。
(2) (1)のシート内のA列の値が"項目名称"の行に移動。
(3) 現在位置の行で列値が"備考"の列番号を取得。
(4) 現在行の次の行から、A列の値、B列の値(1~60byte)、(3)の列の値(1~1000byte)を取得。
※(3)の列の値の改行コードはSPACEに置き換える。
(5) (1)、(4)で取得した各値を用いて
COMMENT△ON△COLUMN△(1)の[シート名].(4)の[A列の値]△'(4)の[B列の値]:(4)の[(3)の列の値]';
となるよう文(SQL文)を作成する。
※△はスペース一桁
(6) (5)の値をシート『comment_on』のデータのある最後の行の次の行に書き出す。
(7) (1)のシートのA列にデータがなくなるまで(4)~(6)を実行する。
(8) シート『comment_on』にNULL行を追加し、次のシートに移り、(1)~(7)を実行。
"項目名称"の行番号、"備考"の列番号が一定でなく、シート名も関係ないものが多く、
(7)に関係するレコード数(行数)も一定でないのでどうしたものかわかりかねています。
できるかどうかも含めてなにかお分かりになる方、よろしくお願いします。
No.2ベストアンサー
- 回答日時:
出来るかという問いならVBAで可能だと思います。
> ※ブック内の最初のシートに移動
これは複数シートがあるブックの全シートを対象に調査するなら不要でしょう。
> (1) シート名が"TABLEnnn"(nnnは000から999の間)のシート名を取得。
> シート『comment_on』に"--シート名"を書き出す。
> 取得できないとき『終了しました』を出力し終了。
これはループしながらシート名を判定させれば良いと思います。
判定をどこまでの基準でやる必要があるかもありますが、「"TABLE"で始まるシート」くらいで良ければ、
Sub Test()
Dim ws As Worksheet, Cnt As Integer
Cnt = 0
For Each ws In Worksheets
If ws.Name Like "TABLE*" Then
Cnt = Cnt + 1
'処理
MsgBox ws.Name > 例
End If
Next ws
If Cnt = 0 Then MsgBox "ない"
End Sub
> (2) (1)のシート内のA列の値が"項目名称"の行に移動。
Findメソッドで探し、Rowの値を取得します。
> (3) 現在位置の行で列値が"備考"の列番号を取得。
上記の Row を元にして、Findメソッドで探し、Columnの値を取得します。
> (4) 現在行の次の行から、A列の値、B列の値(1~60byte)、(3)の列の値(1~1000byte)を取得。
> ※(3)の列の値の改行コードはSPACEに置き換える。
Replaceメソッド等を使って vbLf(又は vbCrLf?) を " " に置き換えれば良いと思います。
> (5) (1)、(4)で取得した各値を用いて
> COMMENT△ON△COLUMN△(1)の[シート名].(4)の[A列の値]△> (4)の[B列の値]:(4)の[(3)の列の値]> ;
> となるよう文(SQL文)を作成する。
> ※△はスペース一桁
&で繋げて変数にでも代入すればOKです。
> (6) (5)の値をシート『comment_on』のデータのある最後の行の次の行に書き出す。
Range("A65536").End(xlup).Row + 1 で最終行を判定出来ます。
> (7) (1)のシートのA列にデータがなくなるまで(4)~(6)を実行する。
空白まで上記をループさせれば良いですね。
> (8) シート『comment_on』にNULL行を追加し、次のシートに移り、(1)~(7)を実行。
追加というのが判りませんが、End(xlup).Rowで最終行が判るので +2 の行から次の書込みを開始すれば良いでしょう。
この回答への補足
> (8) シート『comment_on』にNULL行を追加
は、ご指摘のとおり+2行目から書き出せばいいんですね。
(普段テキスト形式のファイルに書き出したりすることが多いので
ついその感覚で書いてしまいました)
ありがとうございます!!
さっそく実装してみます。
VBAは人の作ったのを利用するくらいで
プログラムとしては普段使わないので
なにかとっかりがあれば・・・と思って投稿したのですが
このままでいけそうですね。
つかえるものが組めたら報告します。
ありがとうございました。
No.1
- 回答日時:
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 別ブックの列同士の値が一致したときの処理 1 2022/09/03 08:27
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
- Visual Basic(VBA) Excel VBA 最終行を取得しVlookup関数をコピーする方法をコーディングで教えてください。 3 2023/05/11 13:14
- Excel(エクセル) エクセルシートのデータを1列飛ばしで別ブックのシートに貼り付けるマクロが知りたい 2 2023/06/05 22:37
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Visual Basic(VBA) EXCEL VBA 単語置き換え について質問です ブック名 ぶぶぶ シート名 ししし セル V3〜 3 2023/03/08 01:41
- Excel(エクセル) エクセル関数について 8 2023/06/28 17:04
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- Visual Basic(VBA) Changeイベントで複数セルへの貼り付けおよび値削除時に1個目のセルのみエラーになる 3 2022/12/21 09:07
- Visual Basic(VBA) 貼り付けた値が消えていく 以下はソースファイルの2番目のシートのB6から最終行を取得 ターゲットファ 2 2023/07/27 12:23
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
至急!尿検査前日にオナニーし...
-
尿検査の前日は自慰控えたほう...
-
尿検査前日に自慰行為した時の...
-
首吊りどこ締めるの
-
射精をして1週間以内に尿検査を...
-
変な話しになります。尿検査で...
-
白血球が多いとどんな心配があ...
-
今朝、毎朝の習慣でオナニーし...
-
1日前の検尿
-
検便についてです。 便は取れた...
-
男です。昨日の午後3時くらいに...
-
勃起する時って痛いんですか? ...
-
EXCELで条件付き書式で空白セル...
-
腕を見たら黄色くなってる部分...
-
彼女のことが好きすぎて彼女の...
-
中出しをするとお腹が痛い・・・。
-
小数点以下を繰り上げたものを...
-
EXCELで式からグラフを描くには?
-
2つの数値のうち、数値が小さい...
-
値が入っているときだけ計算結...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
首吊りどこ締めるの
-
中出しをするとお腹が痛い・・・。
-
麻疹風疹の抗体検査結果につい...
-
エクセルでエラーが出て困って...
-
白血球が多いとどんな心配があ...
-
彼女のことが好きすぎて彼女の...
-
検便についてです。 便は取れた...
-
勃起する時って痛いんですか? ...
-
至急!尿検査前日にオナニーし...
-
納豆食べた後の尿の納豆臭は何故?
-
これって喉仏ですか? 私は女性...
-
EXCELで条件付き書式で空白セル...
-
精子が黄色?
-
小数点以下を繰り上げたものを...
-
値が入っているときだけ計算結...
-
口の中に黒い血の塊
-
健否~書類の書き方~
-
甲状腺が腫れているが血液検査...
-
はしかの抗体検査は何科の病院...
-
テスターで断線を調べる方法教...
おすすめ情報