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

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

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

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

SQL

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

Q&A

解決済

3回答

2251閲覧

エクセルのシートにSQLで入力すると文字列にシングルクオーテーションがつく

bors

総合スコア11

INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

SQL

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

0グッド

0クリップ

投稿2020/10/29 08:57

編集2020/10/29 09:03

前提・実現したいこと

エクセルのシートに他シートのデータをSQLで入力すると、
文字列先頭にシングルクオーテーションがつくのを回避したい

(SQLで入力したい理由は、入力シートとデータ一覧を別ブックにして、ブックを開かずにデータ一覧に書き込みたいためです)
(ScreenUpdatingは理解しています。)

発生している問題・エラーメッセージ

入力したデータの文字列にシングルクオーテーションが表示される
イメージ説明

該当のソースコード

VBA

1 2Sub test() 3 4 Dim clm1 As Long 5 Dim clm2 As String 6 Dim clm3 As String 7 8 With Worksheets("入力シート") 9 clm1 = .Range("A1").Value 10 clm2 = .Range("D1").Value 11 clm3 = .Range("D2").Value 12 End With 13 14 15 Dim objCn As New ADODB.Connection 16 Dim objRS As ADODB.Recordset 17 Dim strSQL As String 18 19 'コネクション 20 With objCn 21 .Provider = "Microsoft.ACE.OLEDB.12.0" 22 .Properties("Extended Properties") = "Excel 12.0" 23 .Open ThisWorkbook.Path & "\test.xlsm" 24 End With 25 26 'SQL作成 27 strSQL = "" 28 strSQL = strSQL & " INSERT INTO [一覧データ$] (列1,列2,列3)" 29 strSQL = strSQL & " VALUES ( " & clm1 & "," & "'" & clm2 & "'" & "," & "'" & clm3 & "'" & ")" 30 31 '接続 32 Set objRS = New ADODB.Recordset 33 Set objRS = objCn.Execute(strSQL) 34 35 36 '切断 37 objCn.Close 38 Set objRS = Nothing 39 Set objCn = Nothing 40End Sub 41

試したこと

事前にデータ一覧シートの書式設定を文字にしてもダメでした。
データを書きこんだ後に書式設定のクリアをすれば消えますが、その場合ブックを開かないといけないので、
SQLで入力する意味がないなと思っております。

接頭辞については以下のサイトを見ました。
接頭辞の解説と削除方法

excelのバージョンは2010です。
近々パソコンの買い替え予定があり、2019になる予定です。

どうぞよろしくお願い致します。

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

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

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

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

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

guest

回答3

0

ベストアンサー

Excel2013で実験してみたら、再現したりしなかったりしました。
(1) 最初、勘違いで、[入力シート]と[一覧データ]を同一Book内に置いて実行したら、シングルクオーテーションが付きました。
(2) 勘違いに気づき、[入力シート]と[一覧データ]を別のBookに置いて実行すると、シングルクオーテーションは以下のように付いたり付かなかったりしました。
(2a) (1)を実行してデータにシングルクオーテーションがついた状態のまま、引き続き(2)を実行したら、シングルクオーテーションがつきました。
(2b) 「すぐ上のセルの状態を継承するのか」と思い、(1)を実行し、シングルクオーテーションがついたデータを[Delete]キーでクリアしてから(2)を実行しても、シングルクオーテーションはつきました。
(2c) 「クリアでは状態が消えないのか」と思い、(1)を実行し、シングルクオーテーションがついたデータを[削除]-[シートの行を削除]で行削除してから(2)を実行したら、シングルクオーテーションはつきませんでした。

なので、一度、データを行削除してから実行してみてはいかがでしょうか。

投稿2020/10/29 13:39

編集2020/10/29 20:38
kitasue

総合スコア314

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

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

hatena19

2020/10/30 00:48

同じ実験をしてみて、当方の環境でも現象を再現できました。 しかし、上のセルの状態を継承するという仕様はまだ分かりますが、 同一ブックと外部ブックで動作が違うのはなんでやねん!という感じですね。
bors

2020/10/30 04:23 編集

kitasue様 細かく検証して頂きありがとうございます。説明わかりにくくてすいません。 理解できなくて申し訳ありませんが、お伺いしたいのが、(2a)は入力シート→同ブック内一覧データシート→他ブック内一覧データシートという意味でしょうか?それとも入力シートから直接他ブック内一覧データシートでしょうか? また「シートの行削除を実行して」というのは、出力先の一覧データシートでしょうか? 私の方で、入力シートから直で別ブックの一覧シートにSQLで入力した場合、最初は文字列にシングルクオーテーションがつきませんでした。しかし、数字が文字として入力されました。 (正確にいうと、緑の△に”文字列として入力されています。”とでました。  書式設定は標準のままです) そこで、一覧データシートの数字列だけ書式設定を数値にして、SQLを実行したところ、数字で入りましたが、追加された行だけが、書式設定が標準に変更されました。 そこから色々ためしていたら、シングルクオーテーションがつくようになっていました。 自分で何をしたかよくわからないため、もう少し検証してご報告いたします。
kitasue

2020/10/30 04:42 編集

私は最初勘違いをして、test.xlsmにプログラムも[入力シート]も[一覧データ]も収めたのです。そしてプログラムを実行したらシングルクォーテーション付きでデータが作成されました。その後勘違いに気づき、他のBookにプログラムを置き、実行したら、やはりシングルクォーテーションが付きました。それが(2a)です。 > そこから色々ためしていたら、シングルクオーテーションがつくようになっていました。 一度シングルクォーテーションが付いてしまうと、クリアしてもしつこく蘇ってしまうので、[一覧データ]のデータを行削除したら消えませんか? という問いかけをしたつもりでした。
bors

2020/10/30 05:16 編集

早々のご返答ありがとうございます。しつこくて申し訳ありませんが、 私としては test.xlsm(プログラムと入力シート) 別ブック(一覧シート) という形で考えていました。 kitasue様に実行して頂いたのは  test.xlsm(入力シートと一覧シート) 別ブック(プログラム) でしょうか? 検証してみたいので、お手数ですが、ご返答よろしくお願い致します。
kitasue

2020/10/30 05:27 編集

当方で検証したのは、 test.xlsm(一覧シート) 別ブック(入力シートとプログラム) です。 borsさんの test.xlsm(プログラムと入力シート) 別ブック(一覧シート) の別ブックはどこで指定していますか?
bors

2020/10/30 05:40

ご返答ありがとうございます。たびたびすいません。 私も test.xlsm(一覧シート) 別ブック(入力シートとプログラム) でした。 よく確認せず申し訳ございません。検証してみます。
bors

2020/10/30 08:26 編集

お待たせしました。 book1(入力シートとプログラム)book2(一覧シート)として一覧シートに出力した場合、 book2を開いた状態でプログラムを実行→文字列には必ずシングルクオーテーションがつく book2が閉じた状態でプログラムを実行→前行にシングルクオーテーション有だとつく 〃                 →前行にシングルクオーテーション無だとつかない となりました。 ブックが開いているかどうかが優先され、その次にkitasue様のおっしゃるとおり、前行のデータが影響するようです。 ブックが開いている場合、数字列は書式設定の有無でシングルクオーテーションがつくつかないが 変わるようです。(これは詳細に検証していません) ブックを開かずにと自分でいいながら、ブックを開きながら検証していてわけがわからなくなっていました。 また、ご指摘の通り、データを削除したい場合は行削除しないとダメでした。 お付き合い下さりありがとうございました。
kitasue

2020/10/30 11:02

フィードバックありがとうございました。
guest

0

当方の環境ではそのコードで文字列先頭にシングルクオーテーションはつかずに入力できました。
excelのバージョンは2019です。
バージョンの違いなのか、それともどこかに設定があるのか、どうなんでしょうね。

最悪、ブックを開くしかないように思いますが、その時は、下記のようにすると普通に開くより高速化できます。
Newで新規Excelインスタンスを生成してそちらで開く。

vba

1  Dim xls As New Excel.Application 2  Dim wb As Workbook 3  Application.ScreenUpdating = False 4  Set wb = xls.Workbooks.Open(ThisWorkbook.Path & "\test.xlsm") 5 6 '以下略

投稿2020/10/29 12:10

編集2020/10/29 12:20
hatena19

総合スコア33699

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

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

bors

2020/10/30 04:46

検証ありがとうございます。kitasue様の方法でも試していただきありがとうございます。kitasue様のコメントに記載させていただきました通り、もう少し検証して再度ご報告いたします。 1つお伺いしたいのが、新規インスタンスを生成してブックを開くことができないのですが、 どうしてかお分かりになるでしょうか? testブックと同一フォルダ内にブックを作成 教えていただいたコードに、 Application.ScreenUpdating = True Range("A1").Select を追加して実行しましたが、青いクルクルが2~3秒でてブックが開きません。エラーは出ません。 参照設定でMicrosoft Excel 14.0 Object Libraryにチェックは入っています。 レイトバインディングで実行してもダメでした。 32ビット版なのですが、何か関係しているでしょうか?
hatena19

2020/10/30 05:13

Newしたエクセルから開くと非表示で開きますので、Selectをしないようにコーディングしてください。 データの転記ならSelectする必要はないです。
bors

2020/10/30 08:17

ご返答ありがとうございます。新規インスタンスを生成してブックを開くことができました。また、kitasue様へのコメント欄の方にsqlでの実験結果を記載させていただきました。
guest

0

先頭のシングルクオートは、続く文字を文字列として扱うことを示すものです。

質問のプログラムでは、clm1が数字(Long)、clm2とclm3が文字列(String)であると宣言されています。

clm1,clm2,clm3の値をExcelのセルに入れると、clm1が入れられるA列は数字なので右詰になり、clm2とclm2が入れられるB,C列は文字列なので左詰になっています。

投稿2020/10/29 11:37

coco_bauer

総合スコア6915

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

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

hatena19

2020/10/30 00:42

VBAのコードとSQLのコードは全く別物です。 VBAからSQLコードは実行できませんので、ADOを介して実行してもらいます。その時、SQLコードはADOに文字列として渡します。 VBAコードの方で宣言している型はSQLには影響しません。
bors

2020/10/30 04:53

coco_bauer様 ご回答ありがとうございます。私もVBA側の宣言が理由なのかと思ってvariantにして試したりしたのですが、ダメでした。hatena19様のご指摘の通り、SQLには影響していないようですね。難しいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問