アプリ版:「スタンプのみでお礼する」機能のリリースについて

テキストボックスとスピンボタンが複数あり、それぞれ対応しているものどうしで値を変更したいのです。またMAX19で”High” Minで”Low"と表記させたいのですが、間違いのようです。何が足りないもしくは間違いなのでしょうか?よろしくお願いします。
Private Sub Userform_Initialize()
With Worksheets("シート名”)
For j = 28 To 91
For i = 10 To 73
Me.Controls("textbox" & j).Value = Me.Controls("SpinButton" & i).Value
Next
if Me.Controls("textbox" & j).Value ="19" then
value="High"
Elseif Me.Controls("textbox" & j).Value ="-19" then
value="Low"
Endif
End With
End Sub

質問者からの補足コメント

  • また、テキストボックスに値が前もって入力されていたらその値から変動するには追加するコードはありますか?
    コマンドボタンで、値を指示する事もあります。

      補足日時:2018/06/02 16:59
  • こんにちは。
    textbox28はspin button10。textbox29はspin button11、、、となり最後はtextbox91はspin button73の並びでのそれぞれ対応したいのです。ご理解いただけますでしょうか?
    説明不足で申し訳ありません。よろしくお願いします。

    No.1の回答に寄せられた補足コメントです。 補足日時:2018/06/03 11:49

A 回答 (2件)

こんにちは。



これは、掲示板で質問するというよりも制作を依頼するのは、かなり無理のある内容だと思います。私の作ったコードをみて、それで判断されても結構です。おそらく、予想しないコードだと思いますか、規模が大きすぎて、こうでもしないと、収まりません。

スピンボタンとテキストボックス自体の連動は、クラスで別途Index を付けて、そのIndexで目的のオブジェクトを呼び出すような仕組みになっています。

基本的には、コントロールをそれだけの数を使うというのは、無理があるような気がしますが、今回は、コントロール自体を、擬似的なコントロール配列にしました。ただ、かなり規模の大きなものになるのは避けられません。このようなマクロを書くのは、何年ぶりかです。こういうコードを書くと、無視したりボツにする人も多いようですが……。

'//
-----------------
'標準モジュール
Public myTBoxes As Collection
Public mySpines As Collection
-----------
'UserFormモジュール
Dim myClass1() As New Class1 'プロシージャ外変数


Private Sub UserForm_Initialize()
Dim i As Long, T As Long, n As Variant
Dim k As Variant, j As Long

Set myTBoxes = New Collection
Set mySpines = New Collection

On Error Resume Next
k = 1
For i = 28 To 91 'TextBox 38-目的の数91
 myTBoxes.Add Me.Controls("TextBox" & i), CStr(k)
 k = k + 1
Next
k = 1
For i = 10 To 73 'SpinButton 10-目的の数73
 mySpines.Add Me.Controls("SpinButton" & i), CStr(k)
 k = k + 1
Next
On Error GoTo 0
T = myTBoxes.Count + mySpines.Count
ReDim myClass1(T)
k = 1
For i = 0 To myTBoxes.Count - 1
 Set myClass1(i) = New Class1
 With myClass1(i)
  .Txbx = myTBoxes(k)
  .Index = k
 End With
 k = k + 1
Next
k = 1
For j = i To T - 1
 Set myClass1(j) = New Class1
 With myClass1(j)
  .Spn = mySpines(k)
  .Index = k
 End With
 k = k + 1
Next
End Sub
--------------
'Class1 クラスモジュール

Private WithEvents mySpn As MSForms.SpinButton
Private WithEvents myTxBx As MSForms.TextBox
Private m_Index As Variant
Const sMax = 19
Const sMin = -19

Public Property Get Spn() As MSForms.SpinButton
Set Spn = mySpn
End Property

Public Property Let Spn(ByVal spnNewValue As MSForms.SpinButton)
Set mySpn = spnNewValue
mySpn.Max = sMax
mySpn.Min = sMin
End Property
Public Property Get Txbx() As MSForms.TextBox
Set Txbx = myTxBx
End Property

Public Property Let Txbx(ByVal txbxNewValue As MSForms.TextBox)
Set myTxBx = txbxNewValue
End Property

Public Property Get Index() As Variant
Index = m_Index
End Property

Public Property Let Index(ByVal NewValue As Variant)
m_Index = NewValue
End Property

Sub SpinBtnUpDown(myChange As Long)
Dim myVal As Variant
myVal = myTBoxes(m_Index).Text
If IsNumeric(myVal) Then
 If CInt(myVal) < sMax Or CInt(myVal) > sMin Then
  mySpn.Value = CInt(myVal) + myChange
 End If
ElseIf myVal = "Max" Then
 mySpn.Value = sMax
ElseIf myVal = "Min" Then
 mySpn.Value = sMin
End If
myTBoxes(m_Index).Value = mySpn.Value
End Sub

Private Sub mySpn_SpinDown()
If myTBoxes(m_Index).Value = "Max" Then
 myTBoxes(m_Index).Value = sMax - mySpn.SmallChange
End If
SpinBtnUpDown -mySpn.SmallChange
End Sub

Private Sub mySpn_SpinUp()
If myTBoxes(m_Index).Value = "Min" Then
 myTBoxes(m_Index).Value = sMin + mySpn.SmallChange
End If
SpinBtnUpDown mySpn.SmallChange
End Sub

Private Sub myTxBx_Change()
If myTxBx.Value = sMax Then
 myTxBx.Value = "Max"
ElseIf myTxBx.Value = sMin Then
 myTxBx.Value = "Min"
End If
End Sub
「VBA 複数のテキストボックスとスピンボ」の回答画像2
    • good
    • 0
この回答へのお礼

御回答ありがとうございます。
こんな大変なコードを作っていただきありがとうございます。
また、大変時間を費やしていただいたかと思うと感謝しかありません。
多くの指示が必要なんですね。私の知識ではまだまだ理解に時間がかかるようです。ご指示していただいたコードを1つずつ理解しながらコード作成頑張りたいと思います。
本当にありがとうございました。

お礼日時:2018/06/06 02:36

>それぞれ対応しているもの


どう対応してるのですか?
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!