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

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

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

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

2回答

796閲覧

【Excel vba】inputboxで入力されたデータにダブルコーテーションがつく。

NextSt

総合スコア13

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2018/04/04 01:27

いつも色々とお世話になります。

今回はExcelのvbaで下記のマクロを組んだのですが、
Do until~ Loopの繰り返し回数を決める箇所で、
inputboxを使いデータの数を手動で入力させるようにしましたが、
変数num_allにデータを入れる部分のみダブルコーテーションがつきます。

Excel

1Sub 重複確認() 2Dim x, y, x1, comp_ch, num_all, num_all_ch, line_end As Long 3x = 1 4x1 = 1 5y = 1 6comp_ch = 0 7 8line_end = Application.InputBox("データが存在する一番右端の列番号を入力して下さい。例)A2→2 ", Type:=2) 9num_all = Application.InputBox("データ数を入力して下さい。", Type:=2) 10'####↑inputboxで入れるとnum_allのみ数字の前後に”がついてしまう。cf)"25"#### 11 12Do Until num_all_ch > num_all 13'####↑ここで繰り返し処理の回数を制限しているが、””がついている為止まらない。#### 14 15 Do Until Cells(x + x1, y) = "" Or comp_ch = 1 16 17 If Cells(x, y) = Cells(x + x1, y) Then 18 19 Range(Cells(x + x1, y), Cells(x + x1, line_end)).Interior.ColorIndex = 35 20 21 comp_ch = 1 22 23 ElseIf Cells(x, y) <> Cells(x + x1, y) Then 24 25 x1 = x1 + 1 '内容が被ってないので次へ 26 27 End If 28 29 Loop 30 31 comp_ch = 0 32 num_all_ch = num_all_ch + 1 33 x = x + 1 34 x1 = 1 35 36Loop 37End Sub

Application.InputBox("〇〇〇〇〇〇〇〇〇〇", Type:=2)と同一の書き方をしており、
データを格納する変数もlongで統一しております。

試しに別PC・異なるverのExcelで実行しましたが、やはり"xx"とダブルコーテーションを含んでしまいます。

ダブルコーテーションをつけない方法はありますでしょうか?

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

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

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

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

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

guest

回答2

0

ベストアンサー

戻り値のタイプを数値にすればよいでしょう。

VBA

1num_all = Application.InputBox("データ数を入力して下さい。", Type:=1)

https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/application-inputbox-method-excel

但し文字列であってもVBAはうまく処理してくれるので問題はありません。
ちなみにダブルクォーテーションが付加されているのは、ステップ実行等で値を確認したときだと思いますが、これは値が数値ではなく文字列ですよ、という表示上のことだけであって、実際にダブルクォーテーションが付加されているわけではありません。

おそらく問題はループ内の処理にあるのではないかと思います。
ループ内のループは正しく処理できていますか?
試しにこのループ処理をコメントアウトして動かしてみても無限ループしますか?
num_all_chの初期化は不要ですか?

余談ですが、変数の型は明示的に宣言しましょう。

投稿2018/04/04 01:52

ttyp03

総合スコア16996

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

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

NextSt

2018/04/04 02:17

お返事ありがとうございました。 参考書を読み間違えており、 Type:=2と記載している事に気づきません。 type:=1とした所、問題なく処理が完了しました。
ttyp03

2018/04/04 02:21

やはり文字列で受け取っていたのが原因でしたか。 個人的には解せないのですが、まあ動いたのならよかったです。 ちなみにline_endもType:=2になっていますのでご注意を。
ExcelVBAer

2018/04/04 04:14 編集

自分も同じ勘違いをしたことあったな~ "2" って表示されるから、"が付いてる??って思っちゃう(笑) ちなみに、念の為に確認したいときは、 プログラム実行時にイミディエイトウィンドウで、 ?[変数名] + Enter ってすると、 変数に格納されている値が見れるので、参考まで~
guest

0

vba

1Dim x, y, x1, comp_ch, num_all, num_all_ch, line_end As Long

ひょっとして、これで、この変数すべてLong型で宣言していると勘違いしているのでは。
これだと、最後のline_endのみLong、それ以外は Variantになります。
面倒でも下記のように省略せずに記述しましょう。

vba

1Dim x As Long, y As Long, x1 As Long, comp_ch As Long, num_all As Long, num_all_ch As Long, line_end As Long

そうすれば、テキストでも数値に変換してくれます。
変換できないものはエラーになるので、エラー処理で対処します。

vba

1Application.InputBox("データ数を入力して下さい。", Type:=1)

とType引数で数値を指定しておけば、数値以外を入力すれば、このメソッドが警告しますので、自前でエラー処理は不要です。

ちなみに、Type引数は、InputBoxの返すデータ型を設定するものではなく、入力可能な値のタイプを指定するものです。
InputBoxの返すデータ型は、バリアント型なので、戻り値を代入する変数の方で正しいデータ型を設定していないと、想定外の動作になる場合があります。

追記

回答を書いているうちに解決済みになってしまいました(汗)。

Type:=1 にすることで解決したということですが、
それはたまたまと考えたほうがいいでしょう。
InputBoxの返すデータ型はバリアント型なので、それをバリアント型に代入したしたら、どのようなデータ型になるかは不確実です。
受ける変数のデータ型を数値型で宣言しておくのが確実です。

投稿2018/04/04 02:25

編集2018/04/04 02:45
hatena19

総合スコア33620

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

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

NextSt

2018/04/04 04:06

回答いただきありがとうございました。 Dim x, y, x1, comp_ch, num_all, num_all_ch, line_end As Longで、 全てlong型で宣言できていると勘違いしているのは、 まさにその通りでして、 long型で変数を宣言しているのに、 なんで文字列が入ってるの…?という点が、 はっきりしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問