[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『マクロでボタン1回目〜3回目で違う数値を入れたい』(yui)
こんにちは。酷暑の続く中いかがお過ごしでしょうか。
私は、最近マクロを覚えて、エクセルシートを何でもマクロ有効ファイルにするのが最近の病気です。
さて、一つのボタンで押すとA1セルに以下3種類の数値が出るようにしたいのです。
1回目【1,000】、2回目【2,000】、3回目【3,000】
調べてみると、以下のようなコードを見かけました。
−−−−−
Sub 四角形角度付き1_Click()
Static ChkNext As Boolean
If ChkNext = False Then
ChkNext = True
'ここに1回目の実行コードを記述
Cells(1, 1) = 1,000
Else
ChkNext = False
Call Action2
End If
End Sub
Sub Action2()
'ここに2回目の実行コードを記述
Cells(1, 1) = 2,000
End Sub
−−−−−
A1セル→【””】→【1,000】→【2,000】→【3,000】
というようにしたいのですが、マクロでできるものでしょうか?
潔くあきらめて、ボタンを3つ作った方がよいでしょうか?
< 使用 Excel:Microsoft365、使用 OS:Windows10 >
−−−−−−
Sub 四角形角度付き21_Click()
Dim a, b As Long
a = Sheets("参照").Range("AA3").Value '7000
b = Sheets("参照").Range("AA4").Value '9000
If Range("B22").Value = "" Then
Range("B22").Value = a Exit Sub End If
Static ChkNext As Boolean
If ChkNext = False Then
ChkNext = True
'ここに1回目の実行コードを記述
If Range("B22").Value = a Then
Range("B22").Value = b
End If
Else
ChkNext = False
Call Action2
End If
End Sub
Sub Action2()
'MsgBox "2回目の押下です。"
'ここに2回目の実行コードを記述
If Range("B22").Value = 9000 Then
Range("B22").Value = ""
End If
End Sub
−−−−−−−−−−
もっとも4回目はどうにもならないので、
その時はこんどこそべつでボタン作成します。。。。
お目汚しいたしました。。。
(yui) 2023/08/02(水) 16:57:59
その場合は、SubやFunctionの外側に変数を宣言すれば、変数はSubやFunctionが終了しても保持されます。
変数のスコープ(有効範囲)というのも気にしてほしいのですが、例えば標準モジュールに宣言します。
例)Public Amode As Long
Publicというのは、他のモジュールからもアクセス可能という意味だったかな。
それで、Amodeは保持されているので、Amodeの値を変えていきます。
例)
Private Sub CommandButton5_Click()
Select Case Amode Case 0 Amode = 1 Me.CommandButton5.Caption = "卒" Me.CommandButton5.BackColor = &HC0C0FF Case 1 Amode = 2 Me.CommandButton5.Caption = "他" Me.CommandButton5.BackColor = rgbBurlyWood Case 2 Amode = 3 Me.CommandButton5.Caption = "全" Me.CommandButton5.BackColor = rgbThistle Case 3 Amode = 0 Me.CommandButton5.Caption = "在" Me.CommandButton5.BackColor = &H8000000F End Select End Sub
上記は実際に使っているコードをコピーしただけです。処理内容は気にしないでください。
どこかで宣言した変数を初期化した方が良いかも知れません。
(ゆたか) 2023/08/02(水) 17:05:49
Sub 四角形角度付き21_Click() With Range("B22") Select Case .Value Case "": .Value = 7000 Case 7000: .Value = 9000 Case 9000: .Value = "" End Select End With End Sub (フォーキー) 2023/08/02(水) 17:11:41
Private Sub CommandButton1_Click() Static c As Long c = c + 1 CommandButton1.BackColor = RGB((c Mod 3) * 64 + 127, 64, 64) End Sub
シートにActiveXコントロールのコマンドボタンを置いて、シートモジュールにこれを貼り付けてお試しください。
(火災報知器) 2023/08/02(水) 20:35:44
B列(B1から連続した任意行まで)に切り替える数値が入力してあるとして A1の値を変化します。 最後尾まで到達したら、セルを空白にします。
Sub Macro1() Dim v, n v = Range("B1", Cells(Rows.Count, "B").End(xlUp).Offset(1)).Value With Range("A1") n = Application.Match(.Value, v, 0) If IsError(n) Then .Value = v(1, 1) Else .Value = v(n + 1, 1) End If End With End Sub
(酢飯) 2023/08/02(水) 20:49:36
フォーキー様 ありがとうございます!
withとcase、勉強しまっす!(使えるようになりたい!)
火災報知器様 ありがとうございます!
>シートにActiveXコントロールのコマンドボタンを置いて、シートモジュールにこれを貼り付けてお試しください。
これは、【挿入→図形→(右クリック)→マクロの登録】、でよかったでしょうか?
(理解度が追いつかずん。。。すみません!(o_ _)o)
酢飯様 画期的!確かに、例えばB列にリストがあって、それをワンクリックごとにループできたらうれしい!!
皆様ほんとありがとうございます!いろいろ紐解いて悩んで、下記↓ちょー地味なマクロになりました。
これなら4つと言わず増やせる!(けど、まだwithつかいきらん。。。泣)
いずれ酢飯様のように別セルのリストを切りかえられるようになりたい!!
ありがとうございました!
Sub
'1→2→3
If Cells(14, 18).Value = 1 Then
Cells(14, 18).Value = 2
Exit Sub
End If
If Cells(14, 18).Value = 2 Then
Cells(14, 18).Value = 3
Exit Sub
End If
If Cells(14, 18).Value = 3 Then
Cells(14, 18).Value = 1
Exit Sub
End If
If Cells(14, 18).Value = "" Then
Cells(14, 18).Value = 1
Exit Sub
End If
End Sub
(yui) 2023/09/12(火) 15:30:34
既に紹介されている Select Case を用いる方が良いと思いますが、 IFステートメントなら、以下の様に記述できます。
Sub test1() If Cells(14, 18).Value = 1 Then Cells(14, 18).Value = 2 ElseIf Cells(14, 18).Value = 2 Then Cells(14, 18).Value = 3 ElseIf Cells(14, 18).Value = 3 Then Cells(14, 18).Value = 1 ElseIf Cells(14, 18).Value = "" Then Cells(14, 18).Value = 1 End If End Sub
Withステートメントを用いるなら
Sub test2() With Cells(14, 18) 'これ以降 With 〜 End With の間では、「.」(ピリオド)の前に Cells(14, 18) が省略されているものとする If .Value = 1 Then .Value = 2 ElseIf .Value = 2 Then .Value = 3 ElseIf .Value = 3 Or .Value = "" Then '同じ処理(.Value = 1)をするので論理式のORを使う .Value = 1 End If End With End Sub
Sub test3() With Cells(14, 18) If .Value = 1 Then .Value = 2 ElseIf .Value = 2 Then .Value = 3 Else 'このIf文内で記述した条件に該当しない時の処理を書く .Value = 1 'マクロ実行前のCells(14, 18)の値が "3" でも "" でも "abc" でも "1" にする End If 'test1及び2のコードでは、Cells(14, 18)が"abc"だった場合、値の変更は行われない End With End Sub
既にあるコードを参考に「いろいろ紐解いて悩む」のも大事なことだと思うのですが、 まずは基本的な知識を学習する事が習得への近道だと思います。 VBAの入門書を購入しなさいとまでは言いませんが、 VBAを解説したWebサイトを一通り閲覧してみてはいかがでしょう。 (酢飯) 2023/09/12(火) 21:01:23
後出しですみませんけど Sub sample() Cells(14, 18).Value = (Cells(14, 18).Value Mod 3) + 1 End Sub でも (´・ω・`) 2023/09/12(火) 22:17:36
(´・ω・`)様 ありがとうございます!
こんなにもシンプルにできるのですね!
(1〜3の数値、だから?)Mod おそるべし。
(yui) 2023/09/13(水) 15:30:32
■1
途中で話が変わってますが今回のケースのような場合
「作戦1」:ボタンを押した回数を保持しておき【回数によって】処理内容を変化させる 「作戦2」:ボタンを押したときに【セルの内容によって】何に変化させればよいか決定する
の2パターンが考えられます。
■2
たとえば↓のように、一定の範囲で繰り返したいのであれば
【""】→【1000】→【2000】→【3000】→【""】→【1000】.... ~~~~~~~~~~~~~~~↑~~~~~~~~~~~~~~~~~~~ ここの範囲で繰り返し
採用された「作戦2」のように、セルの値で条件分岐させるのも有効でしょう。
なお、既に指摘があるところですが、1つのセルの値によって複数に分岐させてますから【Select Case】のほうが向いていると思います。
(まぁ好みの問題でしょうが)
Sub 研究用1() Select Case ActiveSheet.Range("A1").Value Case "": ActiveSheet.Range("A1").Value = 1000 Case 1000: ActiveSheet.Range("A1").Value = 2000 Case 2000: ActiveSheet.Range("A1").Value = 3000 Case 3000: ActiveSheet.Range("A1").Value = "" Case Else: MsgBox ("A1セルに想定外の値が入っています!") End Select End Sub
■3
ですが↓のような場合
【""】→【1000】→【""】→【2000】→【""】→【1000】.... ~~~~~~~~~~~~~~~↑~~~~~~~~~~~~~~~~~~~ ここの範囲で繰り返し
セルの値が【""】のときに、次が【1000】なのか【2000】なのか特定できないため「■2」のアプローチでは解決できません。
そのような場合は、別のアドバイスを採用して
Sub 研究用2() Static 回数 As Long Dim 配列 As Variant
配列 = Array(1000, "", 2000, "") 回数 = 回数 + 1 ActiveSheet.Range("A1").Value = 配列(((回数 - 1) Mod (UBound(配列) + 1))) End Sub
とか
Option Explicit Dim 回数 As Long '=================================================== Sub 研究用3() Dim 配列 As Variant
配列 = Array(1000, "", 2000, "") 回数 = 回数 + 1 ActiveSheet.Range("A1").Value = 配列(((回数 - 1) Mod (UBound(配列) + 1))) End Sub
のようにすれば、当初のようにボタンを押した回数に依存する「作戦1」でも対応できたと思います。
■4
余談になりますが↓のような書き方をすると
Dim a, b As Long Dim a As Variant, b As Long
↑のように解釈されます。型まで指定しようとしているのであれば↓のようにする必要があります。
Dim a As Long, b As Long
また、Variant型であれば、セル範囲の値を一気に格納して配列にすることができますが、↓のように配列の添字が1から始まることを念頭に置いておく必要があります。
Sub おまけ() Dim 配列 As Variant '【7000】→【9000】→【””】 のループ 配列 = WorksheetFunction.Transpose(Worksheets("参照").Range("AA3:AA5").Value) 回数 = 回数 + 1 ActiveSheet.Range("B22").Value = 配列(((回数 - 1) Mod UBound(配列)) + 1) End Sub
(もこな2) 2023/09/18(月) 09:19:12
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.