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

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

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

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

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

Q&A

解決済

4回答

3349閲覧

ExcelのVBAで数字のみの文字列カラムをシングルクォーテーションで囲みたいです。

lovelydai

総合スコア38

VBA

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

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

0グッド

1クリップ

投稿2018/10/03 03:38

こんにちは、またExcelの質問です。

前回の疑問は、解決しました。
リンク内容

問題になってしまったのは、数字のみでできてる文字列の場合です。
たとえば、セルに123456という価が入っている場合、Textとして扱い(‘123456’)したいですが、書いたコードだと、SQLのValueに数字のまま123456が入ってしまいます。
Excelでセル形式を文字列にしてみたり、数字の前に「‘」をつけて文字列に強制変換してみましたが、やはり数字として入ってしまいます。

現在、テーブルにこんな感じでデータが入っていて、SQL文を生成したら、以下になります。(Excelで、create_id列は数値、その他は文字列として形式設定しました。)
|corp_name|description|create_id|create_at
|:--|:--:|--:|
|B会社|123456|1|null

SQL

1INSERT INTO test_corps (corp_name,description,create_id,create_at) VALUES (‘B会社’,123456,1,NULL);

望ましい結果は、こんな感じです。

SQL

1INSERT INTO test_corps (corp_name,description,create_id,create_at) VALUES (‘B会社’,123456,1,NULL);

VBAでコードを書き、セルを繰り返しながら、数字か、空白か、その以外かを判別し、それぞれの処理を行う形です。コードは以下のようです。

VBA

1 '列だけ繰り返す 2 For currentColumnIndex = targetRange.Column + 1 To targetRange.Columns.Count 3 4 '最初でなければ 5 If (currentColumnIndex <> targetRange.Column + 1) Then 6 sql = sql & ", " 7 End If 8 9 'セルを指定 10 Set currentCell = srcSheet.Cells(currentRowIndex, currentColumnIndex) 11 12 'nullか空白なら 13 If IsNull(currentCell) Or Trim(currentCell.Value) = "" Then 14 sql = sql & "null" 15 16 '数値なら 17 ElseIf IsNumeric(currentCell.Value) Then 18 sql = sql & currentCell.Value 19 20 'それ以外なら 21 Else 22 sql = sql & "'" & currentCell.Value & "'" 23 End If 24 25 Next

行か列の形式で数字か文字列かを判別するか、何かIsNumeric以外のメソッドでできる方法がありましたら、教えてください。

長くなりましたが、よろしくお願いします。

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

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

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

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

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

guest

回答4

0

DB側でdescriptionのデータ型がテキストならそのままでもテキストとして保存されると思います。

そんなのは関係なくSQLを直したいのであれば
currentCellの型を判断している辺りでcurrentColumnIndexが2列目の場合の分岐を設けてはどうでしょうか。

投稿2018/10/03 03:51

kobac

総合スコア188

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

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

kobac

2018/10/03 04:33

そもそもの話になってしまいますが「データが数値かどうかを見てSQLを変える」という方法に違和感を感じます・・・。 テーブルのデータ定義がまず先にありきで、それに沿ったSQLを書くべきかと。
guest

0

ベストアンサー

先の回答にあるようにDBで文字列にしてくれると思いますが、VBAでは

vba

1If VarType(currentCell.Value) = vbString Then

で判定できると思います

投稿2018/10/03 04:46

papinianus

総合スコア12705

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

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

lovelydai

2018/10/03 05:32

大変参考になりました。ありがとうございます。
guest

0

列によって、「文字列の列」か「数値の列」かが決まってくるかと思いますので、「格納されている値が数値か文字列か」ではなく、単純に「対象の列が数値の列かどうか」で判定するのが無難かと思われます。

具体的には

'数値なら ElseIf IsNumeric(currentCell.Value) Then sql = sql & currentCell.Value 'それ以外なら Else sql = sql & "'" & currentCell.Value & "'"

のところを

'数値列なら ElseIf currentColumnIndex = 3 Or currentColumnIndex = 5 Then ' 列番号は仮です。実際のものに合わせて適宜修正してください sql = sql & currentCell.Value 'それ以外なら Else sql = sql & "'" & currentCell.Value & "'"

とすれば良いのではないかと(動作未検証)。

投稿2018/10/03 04:00

編集2018/10/03 04:03
nak

総合スコア696

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

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

0

回答ありがとうございました。
原始的ですが、以下のように書いて解決しました。

VBA

1 '数値なら 2 ElseIf IsNumeric(currentCell.Value) Then 3 4 If VarType(currentCell.Value) = vbString Then 5 sql = sql & "'" & currentCell.Value & "'" 6 Else 7 sql = sql & currentCell.Value 8 End If 9 10 'それ以外なら 11 Else 12 sql = sql & "'" & currentCell.Value & "'" 13 End If

投稿2018/10/03 05:27

lovelydai

総合スコア38

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問