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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

3回答

2824閲覧

vba文字列を設定数繰り返し整形する

chanrina0920

総合スコア18

VBA

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2017/10/31 07:03

###前提・実現したいこと
同じ質問させて頂いたのですが、聞き方が悪く欲しい回答を得られていなかったので
再度質問させて頂きます。

vbaでSQL作成するマクロを作成しています。
設定シートに記載された数分NULLを取得し、
下記のような形式に整形したいです。

NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
※但し一番最後は,を付与しない

以前下記のようなソースを提供いただきましたが、
構文の意味が分からないためうまく応用できないでいます。たぶん使えるのだと思うのですが。

compareColumn = compareColumn & IIf(compareColumn = "", " ", "," & vbCrLf) & vbTab & vbTab & vbTab & vbTab & vbTab & "'" & CStr(columnName) & "'"
※IIFの部分

###発生している問題・エラーメッセージ
一旦今まで書いたソースです。
うまくいかないのでデバッグしまくりで汚いです。

'---------------------------------------
'NULLを付与
'---------------------------------------
'NULL繰り返し回数の取得
Dim i As Long
Dim n As String
'Dim output As String
'n = ",NULL"
i = tableSheet.Cells(r, テーブル名シート_NULL付与数列).Text
If i > 0 Then
For j = 1 To i
nullcolumns.Add "NULL"
'output = output & n & vbCrLf & vbTab & vbTab & vbTab & vbTab & vbTab
Next j
'Debug.Print output
'strSQL2 = Replace(strSQL2, "{nullColumn}", output)
' Else
'strSQL2 = Replace(strSQL2, "{nullColumn}", "")
'End If

'Dim lRept As Long
'lRept = Val(tableSheet.Cells(r, テーブル名シート_NULL付与数列).Text)
'Dim sNull As String '繰り返す文字列
'sNull = "NULL"

Dim nullColumn As String '結合結果の文字列
'If lRept > 0 Then
'文字列を指定回数だけ繰り返したした結果をsRetに格納する
'nullColumn = WorksheetFunction.Rept(sNull, lRept)
'Debug.Print nullColumn
nullColumn = ""
nullColumn = nullColumn & IIf(nullColumn = "", " ", "," & vbCrLf) & vbTab & vbTab & vbTab & vbTab & vbTab & CStr(nullColumn)
Debug.Print nullcolumns
strSQL2 = Replace(strSQL2, "{nullColumn}", nullColumn)
Else
End If

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

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

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

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

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

guest

回答3

0

以前の質問では
nullColumn = "(,NULL,NULL,NULL,.....,NULL)"
という結果を作成する、2つの方法をご紹介しました。

①「ループ処理」+「文字列連結」による方法
②「ワークシート関数(REPT)」による方法
の2つです。

今回実現したいことも、処理としては同じく文字列連結です。
前回の処理内容が理解できれば少し手を加えるだけで実現できると思います。

前回の回答には、少し解説が足りていなかったようですので解説を追記させていただきました。

今回はそれを踏まえて、今回の処理を実現するためのアドバイスをさせていただきたいと思います。

でもその前に、(必要なら今のコードをどこか別ファイルにでも保存して)いったんコードをキレイに整理しましょう。
汚いコードは見難いだけでなく、改修も大変になります。
必要なコード/不要なコードを見分けることもコードの理解につながります。


今回は最終的に
nullColumn = "NULL,NULL,NULL,.....,NULL"
という状態を作りたいものと思います。

また今回は
・先頭と最後にはカンマをつけない
・1項目毎に改行を入れる
・"NULL"の前にタブ文字を入れる
といったことも行いたいようです。

タブ文字も改行も文字列という意味では同じですので、今回もすべて文字列の連結や加工の話です。
手順を追って目的の形を組み立てましょう。

①ループで連結

例えば前回の①にならってループ処理で行う場合、

sNull = "NULL," For lLoop = 1 To lRept nullColumn = nullColumn & vbCrLf & vbTab & sNull Next lLoop

と連結していきます。
しかし1周目だけは先頭に不要なタブ文字などを含めたくないので、ここだけ別処理になるように条件文を記述するとよいです。

sNull = "NULL," For lLoop = 1 To lRept If lLoop = 1 Then '1周目は改行とタブを付けない nullColumn = nullColumn & sNull Else '2周目以降は改行とタブを付ける nullColumn = nullColumn & vbCrLf & vbTab & sNull End If Next lLoop

これをIf文ではなくIIf文で記述するとコード行数が短くなりますが、コードが読みにくくなるため私は無理にはオススメしません。

sNull = "NULL," For lLoop = 1 To lRept '1周目(lLoop=1)なら""、2周目以降は改行とタブ に続けて"NULL,"を連結する nullColumn = nullColumn & IIf(lLoop, 1, "", vbCrLf & vbTab) & sNull Next lLoop

これでループを抜けた後には改行とタブが含まれた形で
nullColumn = "NULL,NULL,NULL,.....,NULL,"
という状態が出来上がります。

最後に1つ余分なカンマがありますので、これをLeft関数とLen関数を使って除去します。

Left関数は第1引数で指定した文字列の先頭から、第2引数で指定した文字数分の文字列を返します。
Len関数は第1引数に指定した文字列の文字数を返します。

'nullColumnから最後の1文字を削る nullColumn = Left(nullColumn, Len(nullColumn) - 1)

のように記述することで、例えばnullColumnが"NULL,NULL,NULL,"の15文字だったとすると、先頭から14文字(15-1文字)の文字列が返されます。
つまり右端の1文字を切り捨てた結果が得られるというわけです。
文字列の中にタブ文字や改行が含まれていても1文字に数えられますので、ここでは特に気にする必要はありません。

これでタブ文字や改行も入ったnullColumn = "NULL,NULL,NULL,.....,NULL"という状態が完成します。

②REPT関数を利用する

REPT関数を使った方法もご紹介します。

まず、前回同様にRept関数で文字列連結します。

sNull="NULL," If lRept > 0 Then '文字列を指定回数だけ繰り返したした結果をsRetに格納する nullColumn = WorksheetFunction.Rept(sNull, lRept) EndIf

繰り返し回数が3回だったとすると、"NULL,NULL,NULL,"という結果が得られます。

やはり最後に余分なカンマがありますので、これを除去します。

'nullColumnから最後の1文字を削る nullColumn = Left(nullColumn, Len(nullColumn) - 1)

結果、"NULL,NULL,NULL"という状態が出来上がります。

これだけではまだタブ文字や改行が含まれていません。
今回はここからReplace関数を使ってタブ文字や改行を混ぜ込みます。

Replace関数は、第1引数で指定した文字列の中にから、第2引数で指定した文字列を探しだし、それらを第3引数で指定した文字列に置換する関数です。

'nullColumnの中のカンマを、カンマ+改行+タブ文字に置換する nullColumn = Replace(nullColumn, "," , "," & vbCrLf & vbTab )

このように記述することでnullColumn変数の中の,の文字列が, & vbCrLf & vbTabに置き換わります。
これで改行やタブ文字が含まれた、目的の結果が完成となります。

ところでこのRept関数を使った方法では①のループ処理で行った時のように1周目だけ連結文字列を変える方法を採用せず、あとから置換処理で混ぜ込むといったことをしていますが、これには理由があります。
例えば10階文字列連結を行う場合、①のループ処理では同じ処理を10回繰り返すことで徐々に文字列が連結されていきますが、②のRept関数を使った方法では1回の処理で必要な数だけ文字列連結された結果が得られてしまいます。
繰り返し処理を行っていないため1周目、2周目といった概念がなく、ループ回数で分岐するということもできないのです。

そこで、ある程度形を整えてから一気に文字列置換という形で目的を実現している、というわけです。

ループに比べると少し高度というか、トリッキーな方法になっていますが、理解できたでしょうか。
わかりにくい部分があれば補足しますので、コメント等でご質問ください。

以上、長文になってしまいすみません。
参考になれば幸いです。

投稿2017/11/01 08:06

編集2017/11/01 08:10
jawa

総合スコア3013

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

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

0

せめて、人に見てもらう努力をすべきでしょう。
ここは他人に仕事を押し付ける場所ではありません。

デバッグ用のコード(コメントアウトしているコード等)は除去する、
その程度の努力もできない人に付き合ってくれる人は希少でしょう。

投稿2017/11/01 04:11

ExcelVBAer

総合スコア1175

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

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

0

ご質問の内容の内容をうまく汲み取れていると良いのですが、単純に、こんな話でしょうか。

VBA

1Sub Sample() 2 3 Dim n As String ' 繰り返す文字列 4 Dim nullClomn As String ' 合成後の文字列 5 Dim buf() As Variant ' 指定回数繰り返す文字用配列 6 Dim i As Long ' ループカウント用インデックス 7 Dim iMax As Long ' 繰り返し回数 8 9 ' 繰り返す文字を設定。 10 11 n = "Null" 12 13 ' 繰り返す回数を設定。とりあえず10回。 ※配列を0始まりにしています。 14 15 iMax = 9 16 'i = tableSheet.Cells(r, テーブル名シート_NULL付与数列).Text 17 18 ' 配列の初期化。 19 20 ReDim buf(0) 21 22 ' 配列への格納と配列の拡張を繰り返し。 23 24 For i = 0 To iMax - 1 25 buf(i) = n 26 ReDim Preserve buf(UBound(buf) + 1) 27 Next i 28 29 ' 最後の一回分を格納。 30 31 buf(i) = n 32 33 ' 文字の合成 34 35 nullClomn = Join(buf, "," & vbNewLine) 36 37 MsgBox nullClomn 38 39End Sub

投稿2017/11/01 02:24

Wolf

総合スコア38

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問