[[20230802161753]] 『マクロでボタン1回目〜3回目で違う数値を入れたax(yui) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『マクロでボタン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 >


すごく変則的ですが、以下で動きました!
A1セルではなく、B22セルに入力しています。
【7000】→【9000】→【””】 のループにすることができました!

−−−−−−
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


ゆたか様 ありがとうございます!高度!!
 数値を入れたいセル=Amodeにすればよい、ということですね!

フォーキー様 ありがとうございます!
  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以外が入っている場合も想定!必要ですね。。。
   with case についていろいろ読んでなんとなくどのように動くかわかったのですが、
   まだ自分では書けないでいます。(o_ _)o
   VBA解説サイトには大変お世話になりました!(まだ閲覧卒業できません。)
値を変えたり参照シートを変えたり、別ブックを参照したり、保存したり、、、いろいろ試してみます〜
ありがとうございました!

(´・ω・`)様 ありがとうございます!
 こんなにもシンプルにできるのですね!
 (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.