Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2016)
文字列を数値に変換する方法について
投稿日時: 17/11/22 18:09:04
投稿者: Dellcasio

いつもお世話になっております。
 
文字列から数字を取り出した数字ですが、
文字列なので、それを数値に変換したいのですが、
うまく出来ません。
 
Val 関数で試してみたのですが、0 になってしまいます。
どなたか、ご指導を頂けないでしょうか?
よろしくお願い致します。
 
Sub t()
 
Dim i6
 
'Doubleで宣言すると型が合いませんになります。
'Dim BBB As Double
 
Dim BBB
 
 
 
For i6 = 1 To 3
 
BBB = "=MID(" & "A" & i6 & ",MIN(FIND({0,1,2,3,4,5,6,7,8,9}, " & "A" & i6 & "&1234567890)), LEN(" & "A" & i6 & ")*10-SUM(LEN(SUBSTITUTE(" & "A" & i6 & ", {0,1,2,3,4,5,6,7,8,9},))))"
                                
Range("B" & i6).Value = BBB
                                
 'Valで変換すると 0 になります。
'Range("B" & i6).Value = Val(BBB)
  
  
Next
 
End Sub

回答
投稿日時: 17/11/22 18:22:33
投稿者: baoo

その処理においてBBBはあくまでその文字列であり、VBAはその関数の計算をしてくれません。
ですので明らかに数値ではありません。
当然、Val関数でも"よく分からない"(とVal君は思っている)文字列は0になってしまいます。
Valではなく、指定の文字列の計算をしてくれる関数を使用する必要があります。
Evaluate関数を使用していかがでしょうか?
その場合は最初の"="は不要です。
 
ただし、Evaluateでも思うようにいかない場合もあります。

投稿日時: 17/11/22 19:43:33
投稿者: Dellcasio

baooさん
ご回答ありがとうございました。
 
Evaluateを試みたのですが、コンパイルエラー
になってつまずいています。
 
もしよろしければ
どこが間違っているかご指摘を頂けないでしょうか?
よろしくお願い致します。
 
Sub t()
 
Dim i6
Dim BBB As Double
'Dim BBB
 
 
 
For i6 = 1 To 3
 
BBB =Evaluate(MID("A" & i6,MIN(FIND({0,1,2,3,4,5,6,7,8,9},"A" & i6 &1234567890)),LEN("A" & i6)*10-SUM(LEN(SUBSTITUTE("A" & i6,{0,1,2,3,4,5,6,7,8,9},)))))
 
 
                                 
Range("B" & i6).Value = BBB
                             
                                
'Range("B" & i6).Value = Val(BBB)
  
  
Next
 
End Sub

回答
投稿日時: 17/11/22 19:44:19
投稿者: WinArrow
投稿者のウェブサイトに移動

BBBの値を再確認してみましょう。
 
Debug.Print BBB
とか
ステップ実行する
とか

回答
投稿日時: 17/11/22 19:51:00
投稿者: もこな2

提示のコードを拝見すると「BBB」という変数に数式を格納して、セル("B" & i6)へ数式を入力したいというよう見えます。
 
この場合、数式は文字列ですから、「BBB」はString型として宣言する必要があります。
 
また、数式をセルに設定する場合、Valueプロパティではなく、Formulaプロパティを使用したほうがよいです。
Valueプロパティでも動くでしょうが、「=」で始まってるから数式と気を利かせて変換しているにすぎないので、数式を取得/設定するFormulaプロパティのほうがベターかと思います。

投稿日時: 17/11/22 19:52:48
投稿者: Dellcasio

WinArrow さんの引用:
BBBの値を再確認してみましょう。
 
Debug.Print BBB
とか
ステップ実行する
とか

 
 
WinArrowさん
いつもご回答ありがとうございます。
 
ディバックの勉強はまだしてませんでしたので
これがら勉強を始めるところです。

回答
投稿日時: 17/11/22 19:57:23
投稿者: baoo

ん?
元々、下記のように書かれていましたよね。

Dellcasio さんの引用:
BBB = "=MID(" & "A" & i6 & ",MIN(FIND({0,1,2,3,4,5,6,7,8,9}, " & "A" & i6 & "&1234567890)), LEN(" & "A" & i6 & ")*10-SUM(LEN(SUBSTITUTE(" & "A" & i6 & ", {0,1,2,3,4,5,6,7,8,9},))))"
 
 
Range("B" & i6).Value = BBB
 
'Valで変換すると 0 になります。
'Range("B" & i6).Value = Val(BBB)
BBBの文字列の最初の"="を抜いて、
Val関数の代わりにEvaluate関数を使用すると
BBB = "MID(" & "A" & i6 & ",MIN(FIND({0,1,2,3,4,5,6,7,8,9}, " & "A" & i6 & "&1234567890)), LEN(" & "A" & i6 & ")*10-SUM(LEN(SUBSTITUTE(" & "A" & i6 & ", {0,1,2,3,4,5,6,7,8,9},))))" 


Range("B" & i6).Value = BBB 

'Valで変換すると 0 になります。 
Range("B" & i6).Value = Evaluate(BBB)
後は、BBBの中身次第です。

回答
投稿日時: 17/11/22 20:00:57
投稿者: WinArrow
投稿者のウェブサイトに移動

今回は、B列セルに数式を代入しようとしているわけだから
 
Range("B" & i6).Formula = BBB
が正しい記述です。
 
Evaluateを使うとB列セルに「値」が代入されます。
 
※Evaluateの使い方
Aplication.Evaluate(BBB)
 
 
※BBBには、数式の内容が文字列で編集されています。
ですから
Val(BBB)はあり得ません。無茶苦茶です。
 
 

回答
投稿日時: 17/11/22 20:02:31
投稿者: もこな2

なんとなくこっちかなと思ったのでご参考まで
VBAのコード上でワークシート関数を使用する方法
https://www.moug.net/tech/exvba/0100035.html

回答
投稿日時: 17/11/22 20:09:22
投稿者: baoo

あれ?
Range("B" & i6).Value = BBB
と書いていて、一応それでも数式が入るから、
数式を入力する代わりに計算結果の値を入力したいということかと思ったのですが。

投稿日時: 17/11/22 20:14:56
投稿者: Dellcasio

baoo さんの引用:
ん?
元々、下記のように書かれていましたよね。
Dellcasio さんの引用:
BBB = "=MID(" & "A" & i6 & ",MIN(FIND({0,1,2,3,4,5,6,7,8,9}, " & "A" & i6 & "&1234567890)), LEN(" & "A" & i6 & ")*10-SUM(LEN(SUBSTITUTE(" & "A" & i6 & ", {0,1,2,3,4,5,6,7,8,9},))))"
 
 
Range("B" & i6).Value = BBB
 
'Valで変換すると 0 になります。
'Range("B" & i6).Value = Val(BBB)
BBBの文字列の最初の"="を抜いて、
Val関数の代わりにEvaluate関数を使用すると
BBB = "MID(" & "A" & i6 & ",MIN(FIND({0,1,2,3,4,5,6,7,8,9}, " & "A" & i6 & "&1234567890)), LEN(" & "A" & i6 & ")*10-SUM(LEN(SUBSTITUTE(" & "A" & i6 & ", {0,1,2,3,4,5,6,7,8,9},))))" 


Range("B" & i6).Value = BBB 

'Valで変換すると 0 になります。 
Range("B" & i6).Value = Evaluate(BBB)
後は、BBBの中身次第です。

 
 
baooさん
ご回答ありがとうございました。
 
出来ました。
一日中格闘してましたが
やっと出来ました。
ありがとうございました。
 
[/b]