Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10 Pro : Excel 2016)
コンボからのデータ型が文字列
投稿日時: 20/04/09 13:01:19
投稿者: いんか

お世話になります。
以下のコードをワークシートwsInpに記述しました。
A_inpWSの値がelseifの条件の時に、セルの色を変えたいです。
 
A_InpWSの入力なのですが、コンボリストから値を選択し、その値をA_InpWSに書きたいのです。
すると、データ型が文字列?になってしまい、うまく動きません。
A_Inpに直接、値を入力するとうまく動きます。
 
elseif以下の条件の"ResWD"は、A_InpWSで入力した値を一旦別のシート(wsRes)のセルに落とし、
その値をVALUE()にして状態です。それでもだめでした。A_InpWsを直接指定してもダメ。
データの型の問題と思いますが、いい解決法が浮かびません。
 
ご教授くださいませんか
 
 
ElseIf wsRes.Range("ResWD") >= 0.13 And wsRes.Range("ResWD") <= 0.22 And wsRes.Range("B径") < 5.6 Then
 
Private Sub Worksheet_Change(ByVal Target As Range)
 
Dim wsInp As Worksheet
Set wsInp = Sheet51
 
Dim wsRes As Worksheet
Set wsRes = Sheet1
 
If Intersect(Target, wsInp.Range("A_InpWS")) Is Nothing Then
  Exit Sub
'Application.EnableEvents = False
ElseIf wsRes.Range("ResWD") >= 0.13 And wsRes.Range("ResWD") <= 0.22 And wsRes.Range("B径") < 5.6 Then
  Target.Interior.Color = RGB(255, 125, 129)
'Application.EnableEvents = True
Else: Target.Interior.Color = RGB(255, 255, 255)
 
End If
 
 
 
End Sub
 

回答
投稿日時: 20/04/09 13:38:11
投稿者: mattuwan44

Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Range("A_InpWS")) Is Nothing Then Exit Sub
    Target.Interior.Color = vbWhite

    If Range("ResWD") >= 0.13 _
       And Range("ResWD") <= 0.22 Then
        If Range("B径") < 5.6 Then
            Target.Interior.Color = vbBlue
        End If
    End If
End Sub

 
Ifの使い方じゃないですかね?
こうでなくてもいいかもしれないけど、
もう少し順を追って処理していった方が分かりやすいと思いますけど。。。

回答
投稿日時: 20/04/09 17:12:35
投稿者: WinArrow
投稿者のウェブサイトに移動

もともと、コンボボックスのテキストは文字列です。
 
コンボボックスの値をセルに格納している
コードを提示してください。
その時の値(スペースの位置もわかるように)も一緒に
 

投稿日時: 20/04/13 13:56:50
投稿者: いんか

わかりづらくなってしまって申し訳ありません。
 
mattuwan44様のコードのほうがわかりやすく、ありがとうございます。
 
WinArrow様へ
>もともと、コンボボックスのテキストは文字列です。
>コンボボックスの値をセルに格納している
>コードを提示してください。
>その時の値(スペースの位置もわかるように)も一緒に
   
値をA_InpWSセルに記述するには、コンボボックスのLINKEDCellプロパティで
A_InpWSセルを指定しています。コードは書いておりません。
そうすると、確かにコンボボックスのテキストは文字列となります。文字列だとコードが動きません。
しかし、A_InpWSへ直接記述すると数値となり、そうすると、うまく動きます。
 
テキスト型を何とかしようと、RESWDセルへ=VALUE()関数を入れて、そちらを参照してもダメだった、
ということです。
 
本当は、直接入力しても、コンボで選択しても同じ型になりたいのですが。

回答
投稿日時: 20/04/13 14:19:45
投稿者: WinArrow
投稿者のウェブサイトに移動

問題となっている
 コンボボックス
 は、Activexコントロールですよね?
  
コンボボックスは、
フォームコントロール
Activexコントロール
 ユ―ザーオーム
 と、3種類あるから、どれを使っているのか・・・・説明してほしいですね・・
  
各々に特性というか仕様があるから、それも含めてどれを使うか決めることです。
  
今回の場合は、
 Activexコントロール
 を使っているから、目視で文字列になることはわかるはず、
それならば、その値を参照する側で、数値化するコードを書かなくちゃ・・・・
  
変数 = Clng(セル)
だけで数値化できますよ

投稿日時: 20/04/14 14:29:48
投稿者: いんか

お世話になります。
 
今回のコンボボックスはactiveXコントロールです。
また、ご教授いただきました
>変数 = Clng(セル)
>だけで数値化できますよ
に関してですが、入力される値が0.01〜2.3までなので、
LONGよりsingleに該当するかと思い、以下のようにしました。
でも型が違うとでます。
どこがおかしいでしょうか。。
 
  
Private Sub Worksheet_Change(ByVal Target As Range)
 
Dim wsRes As Worksheet
Set wsRes = Sheet1
 
Dim A As Range
Dim B As Range
 
A = CSng("A_InpWS")
B = CSng("A_InpB径")
 
    If Intersect(Target, Range("A_InpWS")) Is Nothing Then Exit Sub
    Target.Interior.Color = vbWhite
 
    If A >= 0.13 _
       And A <= 0.22 Then
        If B < 5.6 Then
            Target.Interior.Color = vbBlue
        End If
    End If
End Sub

回答
投稿日時: 20/04/14 18:01:00
投稿者: WinArrow
投稿者のウェブサイトに移動

いんか さんの引用:

でも型が違うとでます。
どこがおかしいでしょうか。。

型が違う原因は、↓です。
いんか さんの引用:

Dim A As Range
Dim B As Range
 
A = CSng("A_InpWS")
B = CSng("A_InpB径")

 
「変数A」も「変数B」もオブジェクト型変数です。
オブジェクト型変数に「値」を代入することはできないし、
数値でない「値」を浮動小数点に変換もできません。
 
今迄、説明の中に「A_InpB径」は、出現していないので
多分、セル名と判断して
 
Dim A As Single,B As Single
A = CSng(Range("A_InpWS").Value)
B = CSng(Range("A_InpB径").Value)
では、ないでしょうか?
 

回答
投稿日時: 20/04/14 19:23:15
投稿者: mattuwan44

 >文字列だとコードが動きません。
 
動かないではなく、
「比較式が正しく判定出来ない。」
ということですかね?
 
Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Range("A_InpWS")) Is Nothing Then Exit Sub
    Target.Interior.Color = vbWhite
 
    If cdbl(Range("ResWD").value) >= 0.13 _
       And cdbl(Range("ResWD").value) <= 0.22 Then
        If cdbl(Range("B径").value) < 5.6 Then
            Target.Interior.Color = vbBlue
        End If
    End If
End Sub
 
動作確認してませんので間違いがあれば、ご自分で修正を。
 
Singleでもいいかもしれませんが、また、正しく判定できない可能性があるかも?(ないかも?)
小数を含む数値はDouble型を使うのが普通かも。。。。
検索して研究してみてください。

投稿日時: 20/04/15 10:27:19
投稿者: いんか

WinArrow 様
mattuwan44様
 
回答ありがとうございます。
型の問題は解決できました。SINGLE型でもDOBLE型でも、今回結果は同じように出ました。
もう少し型を勉強してみます。
 
しかし、当初の問題の
A_InpWSセルへの入力方法を、
[activeXコントロールのコンボボックス]から値を選択して、
[LINKEDCellプロパティ]でリンクさせた[A_InpWSセル]へ入力
 
とすると、ダメです。そもそもworksheet_change のコードにいきません。
 
A_InpWSセルへの入力方法を直接入力にすると、Worksheet_Changeのコードにいきます。
 
再度ご教授くださいませんでしょうか。

回答
投稿日時: 20/04/15 10:45:32
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:
[LINKEDCellプロパティ]でリンクさせた[A_InpWSセル]へ入力
  
とすると、ダメです。そもそもworksheet_change のコードにいきません。

 
そうゆう仕様なんでしょうね・・・・
 
入力規則を使うことは試してみるとよいでしょう。
現在のリスト範囲に名前定義されていれば、
元の値に
=定義した名前
と入力するだけで行けるはずです。

トピックに返信