Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


9675 / 13644 ツリー ←次へ | 前へ→

【25857】規則性をプログラムに反映するには にしもり 05/6/16(木) 17:48 質問[未読]
【25860】Re:規則性をプログラムに反映するには ichinose 05/6/16(木) 21:02 発言[未読]
【25863】Re:規則性をプログラムに反映するには [名前なし] 05/6/16(木) 23:53 回答[未読]
【25958】Re:規則性をプログラムに反映するには にしもり 05/6/20(月) 7:51 お礼[未読]
【25998】Re:規則性をプログラムに反映するには にしもり 05/6/21(火) 12:01 質問[未読]
【26011】Re:規則性をプログラムに反映するには ponpon 05/6/21(火) 19:51 発言[未読]
【26054】Re:規則性をプログラムに反映するには にしもり 05/6/22(水) 16:37 お礼[未読]
【26078】Re:規則性をプログラムに反映するには [名前なし] 05/6/22(水) 23:32 発言[未読]

【25857】規則性をプログラムに反映するには
質問  にしもり  - 05/6/16(木) 17:48 -

引用なし
パスワード
    こんにちは。
以前、みなさまのおかげで以下のシフト表作成のプログラムを組みました。
いま新たな2要件がでてきました。
パターンIの人をr=12,13,24,25,36,37,48,49,60,61,72,73,84,85の場合はm=6から表出させたい、という要件です。
パターンIIの人をr=12,13,24,25,36,37,48,49,60,61,72,73,84,85の場合は表出させない、という要件です。
規則性はあると思うのですが私の実力不足でプログラムに反映できません。
どこを修正すればよいか、どなたかご教示ください。

Sub test2()

  Dim v As Variant
  Dim lc As Long
  Dim r As Long
  Dim m As Long
  Dim i As Long
  Const lr As Long = 90
  Dim rag As Range, FRw As Long
  
'パターンI

  v = Worksheets("人員").Range("A2:A30").Value
  With ActiveSheet
    If .Name = "人員" Then
      MsgBox "シフト表をアクティブにして実行する事。", 64
      Exit Sub
    End If
    Application.ScreenUpdating = False
    r = 3
    i = 1
    Do While r <= lr
      Select Case True
        Case r Mod 4 = 3
          lc = 20
          m = 6
        Case r Mod 4 = 0
          lc = 14
          m = 8
        Case r Mod 4 = 1
          lc = 14
          m = 8
        Case Else
          lc = 14
          m = 6
      End Select
      Do While m <= lc
        .Cells(r, m).Value = v(i, 1)
        i = i + 1
        If i > 29 Then i = 1
        m = m + 2
      Loop
      r = r + 1
    Loop
    Application.ScreenUpdating = True
  End With

'パターンII

  v = Worksheets("人員").Range("B2:B4").Value
  With ActiveSheet

    Application.ScreenUpdating = False
    r = 4
    i = 1

    Do While r <= lr
      Select Case True
      Case r Mod 4 = 0
        .Cells(r, 6).Value = v(i, 1)
        i = i + 1
        If i > 3 Then i = 1
        r = r + 1
      Case r Mod 4 = 1
        .Cells(r, 6).Value = v(i, 1)
        i = i + 1
        If i > 3 Then i = 1
        r = r + 3
        End Select
    Loop

    Application.ScreenUpdating = True
  End With
  
End Sub


【25860】Re:規則性をプログラムに反映するには
発言  ichinose  - 05/6/16(木) 21:02 -

引用なし
パスワード
   ▼にしもり さん:
こんばんは。

>以前、みなさまのおかげで以下のシフト表作成のプログラムを組みました。
>いま新たな2要件がでてきました。
>パターンIの人をr=12,13,24,25,36,37,48,49,60,61,72,73,84,85の場合はm=6から表出させたい、という要件です。
>パターンIIの人をr=12,13,24,25,36,37,48,49,60,61,72,73,84,85の場合は表出させない、という要件です。
>規則性はあると思うのですが私の実力不足でプログラムに反映できません。
>どこを修正すればよいか、どなたかご教示ください。
Macth関数を使用すると、
rが{12,13,24,25,36,37,48,49,60,61,72,73,84,85}これらの値か否かの
判断は出来ます。

以下のコードを実行してみてください。

'========================================================
Sub test()
  For r = 10 To 30 Step 2
   ans = Application.Match(r, Array(12, 13, 24, 25, 36, 37, 48, 49, 60, 61, 72, 73, 84, 85), 0)
   If IsError(ans) Then
     MsgBox "r=" & r & " は配列内の数値でない"
   Else
     MsgBox "r=" & r & " は配列内の数値"
     End If
   Next
End Sub
このMatch関数をにしもりさんのコード中に入れて判断してみては
いかがですか?

【25863】Re:規則性をプログラムに反映するには
回答  [名前なし]  - 05/6/16(木) 23:53 -

引用なし
パスワード
   ▼にしもり さん:
これが参考になりますでしょうか。

Sub Macro1()
  Dim r As Long
  Dim chk As Boolean
  
  For r = 3 To 90
    'r=12,13,24,25,36,37,48,49,60,61,72,73,84,85の場合chkがTrueになる
    chk = r Mod 12 < 2
    If chk Then MsgBox r
  Next

End Sub

【25958】Re:規則性をプログラムに反映するには
お礼  にしもり  - 05/6/20(月) 7:51 -

引用なし
パスワード
   ▼ichinoseさん、[名前なし] さん:
どうもありがとうございます。
アドバイスを参考にやってみます。

【25998】Re:規則性をプログラムに反映するには
質問  にしもり  - 05/6/21(火) 12:01 -

引用なし
パスワード
   ▼みなさま、
アドバイスを参考に、修正したプログラム(部分)です。
が、Nextに対応するForがありませんとでます。
Forの中にDo Whileを組みこむことはできませんか?


Sub test2()

  Dim v As Variant
  Dim lc As Long
  Dim r As Long
  Dim m As Long
  Dim i As Long
  Const lr As Long = 90
  Dim rag As Range, FRw As Long
  Dim chk As Boolean
  
  v = Worksheets("人員").Range("A2:A30").Value
  With ActiveSheet
    If .Name = "営業日" Then
      MsgBox "シフト表をアクティブにして実行する事。", 64
      Exit Sub
    End If
    Application.ScreenUpdating = False
'    r = 3
     i = 1
    
    For r = 3 To 90
    chk = r Mod 12 > 2
    If chk Then
      
      Do While r <= lr
        Select Case True
          Case r Mod 4 = 3
            lc = 20
            m = 6
          Case r Mod 4 = 0
            lc = 14
            m = 8
          Case r Mod 4 = 1
            lc = 14
            m = 8
          Case Else
            lc = 14
            m = 6
        End Select
        Do While m <= lc
          .Cells(r, m).Value = v(i, 1)
          i = i + 1
          If i > 29 Then i = 1
          m = m + 2
        Loop
        r = r + 1
      Loop
    Next
       
    Application.ScreenUpdating = True
  End With

End Sub

【26011】Re:規則性をプログラムに反映するには
発言  ponpon  - 05/6/21(火) 19:51 -

引用なし
パスワード
   こんばんは。
コードはよく見ていませんが、
>   r = r + 1
>  Loop
 End If '←これがないからでは?
>Next

【26054】Re:規則性をプログラムに反映するには
お礼  にしもり  - 05/6/22(水) 16:37 -

引用なし
パスワード
   ▼ponpon さん:

End If を追加したら実行できました。
恥ずかしながら基本ができていないと思います。
努力します。

【26078】Re:規則性をプログラムに反映するには
発言  [名前なし]  - 05/6/22(水) 23:32 -

引用なし
パスワード
   ▼にしもり さん:
もう見てないかもしれませんが・・・。

「3から初めて90を超えるまで、rを1ずつ増やしながらループを繰り返す」という
意味では、

Const lr As Long = 90
r = 3
Do While r <= lr

  r = r + 1
Loop



For r = 3 To 90

Next

は同じですよ。

提示されたコードのループ部分のみを抜き出した
Const lr As Long = 20
r = 3

For r = 3 To 20
  MsgBox "For..Nextで" & r
  Do While r <= lr
    MsgBox "Do..Loopで" & r
    r = r + 1
  Loop
Next
というコードを実行していただければ、For..Nextのループが
意味が無くなっていることがわかると思います。

9675 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free