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

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

ただいまの
回答率

90.76%

  • SQL

    2228questions

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

  • VBA

    1641questions

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

  • Excel

    1403questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

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

受付中

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 340

chanrina0920

score 10

前提・実現したいこと

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+1

以前の質問では
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周目といった概念がなく、ループ回数で分岐するということもできないのです。

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

Sub Sample()

    Dim n           As String   ' 繰り返す文字列
    Dim nullClomn   As String   ' 合成後の文字列
    Dim buf()       As Variant  ' 指定回数繰り返す文字用配列
    Dim i           As Long     ' ループカウント用インデックス
    Dim iMax        As Long     ' 繰り返し回数

    ' 繰り返す文字を設定。

        n = "Null"

    ' 繰り返す回数を設定。とりあえず10回。 ※配列を0始まりにしています。

        iMax = 9
        'i = tableSheet.Cells(r, テーブル名シート_NULL付与数列).Text

    ' 配列の初期化。

        ReDim buf(0)

    ' 配列への格納と配列の拡張を繰り返し。

        For i = 0 To iMax - 1
            buf(i) = n
            ReDim Preserve buf(UBound(buf) + 1)
        Next i

    ' 最後の一回分を格納。

        buf(i) = n

    ' 文字の合成

        nullClomn = Join(buf, "," & vbNewLine)

        MsgBox nullClomn

End Sub

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • SQL

    2228questions

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

  • VBA

    1641questions

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

  • Excel

    1403questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。