Excel (VBA)

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

 
(Windows 10 Home : 指定なし)
ボタンを押下した時にセル内の数字を消したり表示させたい
投稿日時: 23/01/17 09:59:41
投稿者: vbaaa

1から81までの表を作成し、そこから奇数や偶数、十字や×状、左斜め下だけなどのボタンを押下して
セル内の数字を、そのボタン通りに表示させたいと思っています。
 


Sub mnst()
    Dim i, j
For j = 1 To 9
    For i = 1 To 9
        Cells(i, j) = i * j
    Next
Next
Range("A1,B1,A2,C1,B2,A3,D1,C2,B3,A4,E1,D2,C3,B4,A5,F1,E2,D3,C4,B5,A6,G1,F2,E3,D4,C5,B6,A7,H1,G2,F3,E4,D5,C6,B7,A8").ClearContents
End Sub


 
私が行った方法はRangeオブジェクトを使用してマクロのボタン1つ1つに
消すセルを指定した方法です。期待通り、表示はされていますが
これだと仕様変更された時に対応できないので、適切ではないと持っています。
何を使用するのか、どこを変更するべきかなど、ご教示頂きたいです。

回答
投稿日時: 23/01/17 11:29:30
投稿者: Suzu

9行 × 9列 に 1〜9 の積 を表示する表を作成し、表内の、所々のセルの値を 消す 動作
と言う認識ですが、
 
なんの為に
・その様な仕組みの表を作り セルの値を消す必要があるのか
・何が適切でないと考える理由なのか
・どんな仕様変更を想定するのか
 
等が判らないと、何も言えません。

回答
投稿日時: 23/01/17 11:36:13
投稿者: WinArrow

これは、どの様な目的で作成したものですか?
>仕様変更
 
どのょうな仕様変更を想定しているのでしょう?
 
>Range("A1,B1,A2,C1,B2,A3,D1,C2,B3,A4,E1,D2,C3,B4,A5,F1,E2,D3,C4,B5,A6,G1,F2,E3,D4,C5,B6,A7,H1,G2,F3,E4,D5,C6,B7,A8").ClearContents
このコードは、セルをクリアするものですが、
81個のセルとの関連はないのですか?
 

投稿日時: 23/01/17 11:48:39
投稿者: vbaaa

 
>何の為に
・その様な仕組みの表を作り セルの値を消す必要があるのか
VBAの練習問題を取り組んでいてる状況です。※答えは載っていません
 
>・どんな仕様変更を想定するのか
例えば、九九の表の左上角(1のところ)を、C3から開始して印字する仕様変更があった場合。
他には
九九ではなく、縦100 横100の表だった場合、私の記述だと適切では無いと思いました。

回答
投稿日時: 23/01/17 12:24:02
投稿者: WinArrow

掲示のコードは、81個のセルに数字を入れ、
そのあと、半分くらいを消していますよね?
 
少なくとも
>奇数や偶数、十字や×状、左斜め下だけなどのボタンを押下して
に関連するコードではありませんよね?
 
単に数字をセルに入れるだけのことでしたら
升の数だけを、固定ではなく、可変にすることくらいしかありません。
 1 to 9 の「9」を変数に変更することで事足ります。
 
仕様変更とは、
マスの数ではなく、そのデータを加工、検索、などに対応することです。
 
また、「消す」のではなく、
「見えなくする」という方法もあります。
 
 

投稿日時: 23/01/17 13:30:25
投稿者: vbaaa

説明がわかりずらく申し訳ございません。
掲示したコード以外のコードもVBAのモジュールとして残しています。
そこからExcel開発の挿入からフォームコントロールのボタンを選択して
マクロを登録している状態です。
 
>升の数だけを、固定ではなく、可変にすることくらいしかありません。
 1 to 9 の「9」を変数に変更することで事足ります。
WinArrow様が仰っているこちらが適していると思うのですが
変数を作ってそこに9を入れる認識でよろしいでしょうか?
 
また、消すのではなく見えなくする方法の方が
適切であればご教示頂きたいです。

回答
投稿日時: 23/01/17 14:38:06
投稿者: WinArrow

nta さんの引用:

>升の数だけを、固定ではなく、可変にすることくらいしかありません。
 1 to 9 の「9」を変数に変更することで事足ります。
WinArrow様が仰っているこちらが適していると思うのですが
変数を作ってそこに9を入れる認識でよろしいでしょうか?

 
どこの何を変数としえ使うかは、回答者が考えることではありません。
例としては、
セル(任意)に持たすことも可能です。
但し、最初に数値を埋め込んでいるセルはダメですよね?
 
 
 
nta さんの引用:

また、消すのではなく見えなくする方法の方が
適切であればご教示頂きたいです。

適切かどうかは、あなたが判断することです。
方法論として提示しただけです。
 
見えなくする方法としては、文字色を白にすれば、見えなくなります。
要は、文字色を、セルの塗りつぶしと同じ色にすれば、見えているが見えない。

回答
投稿日時: 23/01/17 15:00:45
投稿者: sk

(標準モジュール)
---------------------------------------------------------------
Option Explicit
 
'定数の宣言
Private Const MaxMultiplier As Long = 9 '乗数の最大値(1以上の整数で指定)
Private Const MultiplicationTableSheetName As String = "Sheet1" '九九表の出力先となるワークシートの名前
Private Const TopLeftCellAddress As String = "C3" '九九表範囲の左上セル(1×1の出力先)の番地
 
'九九表ワークシートを初期化する処理
Sub ClearAllCellsInMultiplicationTableSheet()
 
    '九九表ワークシートの全てのセルをクリア
    ThisWorkbook.Worksheets(MultiplicationTableSheetName).Cells.Clear
 
End Sub
 
'九九表の範囲を返すユーザー定義関数
Function MultiplicationTableRange() As Excel.Range
 
    Dim TopLeftCell As Excel.Range
    Dim BottomRightCell As Excel.Range
     
    '以下、九九表ワークシートの操作
    With ThisWorkbook.Worksheets(MultiplicationTableSheetName)
        '左上セルの参照を取得
        Set TopLeftCell = .Range(TopLeftCellAddress)
        '右下セルの参照を取得
        Set BottomRightCell = TopLeftCell.Offset(MaxMultiplier - 1, MaxMultiplier - 1)
        '左上セルから右下セルまでの範囲を戻り値として返す
        Set MultiplicationTableRange = .Range(TopLeftCell, BottomRightCell)
    End With
 
End Function
 
'九九表に全ての積を出力する処理
Sub OutputAllNumbers()
     
    Dim lngRow As Long
    Dim lngColumn As Long
    Dim lngValue As Long
     
    '以下、九九表範囲の操作
    With MultiplicationTableRange
        '全てのセルの値をクリア
        .ClearContents
        '列番号のループ
        For lngColumn = 1 To MaxMultiplier
            '行番号のループ
            For lngRow = 1 To MaxMultiplier
                '積の算出
                lngValue = lngColumn * lngRow
                '値の代入
                .Cells(lngRow, lngColumn).Value = lngValue
            Next
        Next
        .Parent.Activate
        .Select
    End With
 
End Sub
 
'積が奇数である組み合わせのみ九九表に出力する処理
Sub OutputOddNumbers()
 
    Dim lngRow As Long
    Dim lngColumn As Long
    Dim lngValue As Long
 
    '以下、九九表範囲の操作
    With MultiplicationTableRange
        '全てのセルの値をクリア
        .ClearContents
        '列番号のループ
        For lngColumn = 1 To MaxMultiplier
            '行番号のループ
            For lngRow = 1 To MaxMultiplier
                '積の算出
                lngValue = lngColumn * lngRow
                '積を2で割った余りが0ではない(積が奇数である)場合
                If lngValue Mod 2 <> 0 Then
                    '値の代入
                    .Cells(lngRow, lngColumn).Value = lngValue
                End If
            Next
        Next
        .Parent.Activate
        .Select
    End With
 
End Sub
 
'積が偶数である組み合わせのみ九九表に出力する処理
Sub OutputEvenNumbers()
 
    Dim lngRow As Long
    Dim lngColumn As Long
    Dim lngValue As Long
     
    '以下、九九表範囲の操作
    With MultiplicationTableRange
        '全てのセルの値をクリア
        .ClearContents
        '列番号のループ
        For lngColumn = 1 To MaxMultiplier
            '行番号のループ
            For lngRow = 1 To MaxMultiplier
                '積の算出
                lngValue = lngColumn * lngRow
                '積を2で割った余りが0である(積が偶数である)場合
                If lngValue Mod 2 = 0 Then
                    '値の代入
                    .Cells(lngRow, lngColumn).Value = lngValue
                End If
            Next
        Next
        .Parent.Activate
        .Select
    End With
 
End Sub
 
'行番号と列番号のいずれかが中央の行/列であるセルにのみ九九表に積を出力する処理
Sub OutputCross()
 
    Dim lngRow As Long
    Dim lngColumn As Long
    Dim lngValue As Long
    Dim lngMidMultiplier As Long
     
    '表の中央を示す行番号/列番号を算出
    lngMidMultiplier = (1 + MaxMultiplier) \ 2
 
    '以下、九九表範囲の操作
    With MultiplicationTableRange
        '全てのセルの値をクリア
        .ClearContents
        '列番号のループ
        For lngColumn = 1 To MaxMultiplier
            '行番号のループ
            For lngRow = 1 To MaxMultiplier
                '行番号と列番号のいずれかが表の中央を示す番号に等しい場合
                If lngRow = lngMidMultiplier Or lngColumn = lngMidMultiplier Then
                    '積の算出
                    lngValue = lngColumn * lngRow
                    '値の代入
                    .Cells(lngRow, lngColumn).Value = lngValue
                End If
            Next
        Next
        .Parent.Activate
        .Select
    End With
 
End Sub
 
'行番号が列番号以上であるセルにのみ九九表に積を出力する処理
Sub OutputDiagonalFromLowerLeftCorner()
 
    Dim lngRow As Long
    Dim lngColumn As Long
    Dim lngValue As Long
 
    '以下、九九表範囲の操作
    With MultiplicationTableRange
        '全てのセルの値をクリア
        .ClearContents
        '列番号のループ
        For lngColumn = 1 To MaxMultiplier
            '行番号のループ
            For lngRow = 1 To MaxMultiplier
                '行番号が列番号以上である場合
                If lngRow >= lngColumn Then
                    '積の算出
                    lngValue = lngColumn * lngRow
                    '値の代入
                    .Cells(lngRow, lngColumn).Value = lngValue
                End If
            Next
        Next
        .Parent.Activate
        .Select
    End With
 
End Sub
---------------------------------------------------------------
 
例えばこんな具合に、「乗数の最大値」や「九九表の出力先となる範囲」を
あらかじめパラメータ化しておき、任意に変更できるようにしておきたい、
ということでしょうか。

投稿日時: 23/01/18 09:11:52
投稿者: vbaaa

ありがとうございました。
解決する事が出来ました