[[20210210132320]] 『VBAで時間の増減』(たまひよこ) ページの最後に飛ぶ

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

 

『VBAで時間の増減』(たまひよこ)

投稿内容が見づらい為、再投稿させていただきました。
宜しくお願い致します。

VBAでB14〜Q19の指定した範囲にある時間の入力セルすべてに対して増減をしたいです

↓作りたいユーザーフォーム↓

コンボボックス
1時間
2時間


8時間

チェックボックス
☑30分

オプションボタン
⦿増やす
⦿減らす

OKボタンとキャンセルボタン

     |[B]|[C]|[D]|[E]  |[F]|[G] |[H]|[I] |[J]|[K] |[L]|[M]  |[N]|[O]  |[P]|[Q] 
 [14]|a  |   |   |20:30|   |0:30|b  |    |   |1:00|   |4:00 |c  |     |   |8:00
 [15]|入 |   |   |     |   |    |休 |    |   |    |   |     |休 |     |   |    
 [16]|   |   |   |     |   |    |   |9:00|d  |    |   |10:00|   |11:30|z  |    
 [17]|   |   |待 |     |   |    |   |    |待 |    |   |     |   |     |出 |    
 [18]|   |   |   |     |   |    |   |    |   |    |   |     |   |     |   |    
 [19]|   |   |   |     |   |    |   |    |   |    |   |     |   |     |   |    

↓作ったユーザーフォームよりコンボボックスで1時間を選択し、
チェックボックス30分を選択、オプションボタンで増やすを選択した場合↓

     |[B]|[C]|[D]|[E]  |[F]|[G] |[H]|[I] |[J]|[K] |[L]|[M]  |[N]|[O]  |[P]|[Q] 
 [14]|a  |   |   |22:00|   |2:00|b  |    |   |2:30|   |5:30 |c  |     |   |9:30
 [15]|入 |   |   |     |   |    |休 |    |   |    |   |     |休 |     |   |    
 [16]|   |   |   |     |   |    |   |10:30|d  |    |   |11:30|   |13:00|z  |    
 [17]|   |   |待 |     |   |    |   |    |待 |    |   |     |   |     |出 |    
 [18]|   |   |   |     |   |    |   |    |   |    |   |     |   |     |   |    
 [19]|   |   |   |     |   |    |   |    |   |    |   |     |   |     |   |    

となるようにしたいです。
どのようなコードで書けば思うようなものになるのか教えてください。
宜しくお願いします。

< 使用 Excel:Office365、使用 OS:Windows10 >


 こんにちは ^^
あのぉ〜ユーザーフォームじゃないといけないですか。
空きセル3,4個で代替できそぉなきがしないでもないのですが。
で
どのあたりで、おこまりで。。。
m(_ _)m

(隠居じーさん) 2021/02/10(水) 13:45


見やすくなったかどうかは別にして。
単純に
 (1)何かが入力されていて時刻(日付型)に見えるデータ(セル)をピックアップする
 (2)↑でピックアップしたセルを巡回して、それぞれ計算する

でいいような気がします。
実際どのへんで詰まっているのですか?

(1)で詰まってるというなら別ですけど、(2)で詰まってるということであれば、例えばA1セルに限定したらどうなるかということを考えて書いてみてはどうでしょうか?

例のとおりなら、「A1セルの値」に「1時間」と「30分」足せばいいんですよね?

(もこな2 ) 2021/02/10(水) 14:00


 ユーザーフォームの部分だけ準備してみました
 (だけなので実際には何もしてくれません)

    Option Explicit

    Private CmbHour As MSForms.ComboBox
    Private ChkHalf As MSForms.CheckBox
    Private OptInc As MSForms.OptionButton
    Private OptDec As MSForms.OptionButton
    Private WithEvents BtnOK As MSForms.CommandButton
    Private WithEvents BtnCancel As MSForms.CommandButton

    Private Sub UserForm_Initialize()
        Dim i As Long
        Set CmbHour = Me.Controls.Add("Forms.ComboBox.1", "CmbHour")
        With CmbHour
            For i = 1 To 8
                .AddItem i & "時間"
            Next
            .Style = fmStyleDropDownList
        End With
        Set ChkHalf = Me.Controls.Add("Forms.CheckBox.1", "ChkHalf")
        With ChkHalf
            .Left = 96
            .Caption = "30分"
        End With
        Set OptInc = Me.Controls.Add("Forms.OptionButton.1", "OptInc")
        With OptInc
            .Top = 24
            .Caption = "増やす"
            .Value = True
        End With
        Set OptDec = Me.Controls.Add("Forms.OptionButton.1", "OptDec")
        With OptDec
            .Top = 24: .Left = 96
            .Caption = "減らす"
        End With
        Set BtnOK = Me.Controls.Add("Forms.CommandButton.1", "BtnOK")
        With BtnOK
            .Top = 48
            .Caption = "OK"
        End With
        Set BtnCancel = Me.Controls.Add("Forms.CommandButton.1", "BtnCancel")
        With BtnCancel
            .Top = 48: .Left = 96
            .Caption = "キャンセル"
        End With
    End Sub
    Private Sub BtnOK_Click()
        Dim at As String
        at = Replace$(CmbHour.Value, "時間", "")
        If at = "" Then at = "0"
        at = at & IIf(ChkHalf.Value, ":30", ":00")
        MsgBox at & IIf(OptInc.Value, OptInc.Caption, OptDec.Caption)
    End Sub

 思ったんですけど、オプションボタンで増減選択するより
 [増やす]ボタンと[減らす]ボタンにした方が使い易くないでしょかね?

(白茶) 2021/02/10(水) 14:52


隠居じーさん様
どうしても…というわけではないのですが、
自分以外も使用するので、視覚的にわかりやすい方がいいのかな
と考えた次第です。

もこな2様
(1)で詰まってるです。
もこな2様が例でおっしゃるとおりですが、
範囲は固定ですが私は例で1時間30分で記載しましたが
単純に1時間30分だけの増減だけではなく時間数と増減は使用するタイミングで都度違います。

白茶様
ありがとうございます。

 思ったんですけど、オプションボタンで増減選択するより
 [増やす]ボタンと[減らす]ボタンにした方が使い易くないでしょかね?

確かにおっしゃる通りです。
考えが至らなかったです・・
(たまひよこ) 2021/02/10(水) 15:45


わかりづらかったですかね。。
(1)で詰まってるということなので後の話になるでしょうけど、

 ■例えばA1セルに限定した場合として考えると
【A1セルの値】に
(【コンボボックスで選んだ時間】+【チェックボックスでの選択結果(0分or30分)】)を
【オプションボタンの選択したほう(加算or減算】する

ってことでしょ?と言いたかったわけですが・・・
こちらが分かれば

 (1) セルを巡回して、日付型に見えるセルをピックアップする
 (2)ピックアップしたセルを巡回して計算して書き込む

という処理が組み立てられるとおもって、どこで詰まっているのか確認したのです。

(もこな2 ) 2021/02/10(水) 16:20


もこな2様

上手くお伝え出来ず、すみません。
そうです、おっしゃる通りです。

 (1) セルを巡回して、日付型に見えるセルをピックアップする
 (2)ピックアップしたセルを巡回して計算して書き込む

まさにしたい事、そのものです。

(たまひよこ) 2021/02/10(水) 16:57


うーん。かえって混乱させてしまいましたかね。
もしかしたら↓のようにお伝えしたほうが良かったかもしれません。
 (1)ユーザーフォームで入力(選択)した内容から何時間何分を加算(減算)すればよいか取得する
 (2)決まったセル範囲を巡回して、値が時刻としてみなせるものが入っているセルがあれば(1)の計算をして書き換える

巡回のほうで詰まっているなら、とりあえず(1)のほうを考えてみてはどうですか?

(もこな2 ) 2021/02/10(水) 17:40


巡回のほうは、例えば表示形式をチェックしていき、h:mmになっていたら時刻が入力されているとするとか・・・
    Sub さんぷる01()
        Dim MyRNG As Range
        For Each MyRNG In ActiveSheet.Range("B14:Q19")
            If MyRNG.NumberFormatLocal = "h:mm" Then
                MsgBox MyRNG.Address(False, False) & " は処理が必要です"
            End If
        Next
    End Sub

ちなみに、0:30の時に、1時間引いたらマイナスになりますけど、そういう場合どうするんですか?

(もこな2 ) 2021/02/10(水) 18:18


もこな2様

VBAは本当に素人で、質問する際のフォームの名称もネットで調べた位の知識なもので。。
何が違うのかわからなくて…すみません。

ちなみに、0:30の時に、1時間引いたらマイナスになりますけど、そういう場合どうするんですか?

23:30分となるようにしたいです。

(たまひよこ) 2021/02/10(水) 18:44


最初のほうは
 (1)処理すべきセルをピックアップしておいてから
 (2)(1)のセル【すべて】に処理をしていく方法

こちらのほうが〜としたのは

 (1)加算(減算)すべき時間を固めておいてから
 (2)すべてのセルを順番に見ていき【処理すべきセルであれば】(1)の計算を行うとしたもの

>VBAは本当に素人で〜
そういう状態であれば、なおさら加算(減算)すべき時間を固めるところから手を付けたほうがよいとおもいます。
一番とっかかりやすいと思うので・・・

白茶さんがアドバイスしてくださってるのをよく研究してみてください。
繰り返しになりますが、

 【コンボボックス】で選んだ"文字列"から"時間"という文字を除いたもの  → 時間に相当
 【チェックボックス】の選択状態    → 30分 or 00分
 【オプションボタン】の選択状態        → 加算 or 減算 (というか-1を掛けるか否か)

これらを組み合わせれば、どのような計算をすべきかまでは出せますよね?

(もこな2 ) 2021/02/10(水) 20:23


もこな2様

申し訳ありませんが難しいです。。
ここに書き込みする前に自分のしたい事を検索したのですが、
見本が見つからずその書き方が分からないのです。
実務で使用したくあまり時間が取れないので、サンプルを教えていただくことはできませんか?
フォーム部分は白茶様がサンプルを書いてくださったのを見て、
それを改めて調べてなるほど!と現況理解している感じです。。。

(たまひよこ) 2021/02/10(水) 21:45


作成依頼ということであれば、別の回答者さんをお待ちいただいたほうがよいです。
(よっぽどヒマしてて、気が向けば書き込むかもですが・・・)

それなりにヒントは出したとおもいますし、気が変わって自分でやってみようと思ったら、思う通りの動きでなくとも、まずはそれを提示してみてください。

(もこな2) 2021/02/10(水) 22:42


 サンプルひとつ作ってみましたよ。
 かなり「いいかげん」な作りですから、そのまま実務に使えるとは思わないでくださいね。
 あくまで教材代わりだと思って下さい。

 >改めて調べてなるほど!と現況理解
 いいですねぇ!
 それ一番大切な事だと思いますよ。

    Option Explicit

    Private CmbHour As MSForms.ComboBox
    Private ChkHalf As MSForms.CheckBox
    Private WithEvents BtnInc As MSForms.CommandButton
    Private WithEvents BtnDec As MSForms.CommandButton

    Private Sub UserForm_Initialize()
        Dim i As Long
        Set CmbHour = Me.Controls.Add("Forms.ComboBox.1", "CmbHour")
        With CmbHour
            For i = 0 To 8
                .AddItem i & "時間"
            Next
            .Style = fmStyleDropDownList
            .ListIndex = 0
        End With
        Set ChkHalf = Me.Controls.Add("Forms.CheckBox.1", "ChkHalf")
        With ChkHalf
            .Left = 96
            .Caption = "30分"
        End With
        Set BtnInc = Me.Controls.Add("Forms.CommandButton.1", "BtnInc")
        With BtnInc
            .Top = 24
            .Caption = "増やす"
        End With
        Set BtnDec = Me.Controls.Add("Forms.CommandButton.1", "BtnDec")
        With BtnDec
            .Top = 24: .Left = 96
            .Caption = "減らす"
        End With
    End Sub
    Private Sub BtnDec_Click()
        TimeAdd -1
    End Sub

    Private Sub BtnInc_Click()
        TimeAdd 1
    End Sub
    Private Sub TimeAdd(Sign As Long)
        Dim r As Range, v As Double, t As String
        t = Replace$(CmbHour.Value, "時間", "")
        t = t & IIf(ChkHalf.Value, ":30", ":00")
        For Each r In Range("B14:Q19").Cells
            If WorksheetFunction.IsNumber(r.Value) And Not r.HasFormula Then
                v = TimeValue(r.Text) + TimeValue(t) * Sign
                If v < 0 Then v = v + 1
                r.Value = WorksheetFunction.Text(v, "h:mm")
            End If
        Next
    End Sub

(白茶) 2021/02/10(水) 23:14


私ならこうですかね。
(IIfを使うアイデアは白茶さんから拝借。)
   Sub 研究用()
      Dim コンボボックス As String
      Dim チェックボックス As Boolean
      Dim オプションボタン増 As Boolean
      Dim オプションボタン減 As Boolean

      Dim 増減 As Long
      Dim 増減時間 As Date
      Dim MyRNG As Range

      コンボボックス = "1時間"
      チェックボックス = True
      オプションボタン増 = True
      オプションボタン減 = False

      Stop 'ブレークポイントの代わり

      増減時間 = Replace(コンボボックス, "時間", "") & IIf(チェックボックス, ":30", ":00")
      増減 = IIf(オプションボタン増, 1, -1)

      For Each MyRNG In ActiveSheet.Range("B14:Q19")
         If MyRNG.NumberFormatLocal = "h:mm" Then
            MyRNG.Value = Format(CDate("1900/1/2 " & MyRNG.Text) + (増減時間 * 増減), "h:mm")
         End If
      Next
   End Sub

(もこな2) 2021/02/11(木) 22:10


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.