No.1ベストアンサー
- 回答日時:
以下のマクロを標準モジュールに登録してください。
Option Explicit
Public Sub 出休入れ替え2()
Dim ws As Worksheet '対象シート(アクティブシート)
Dim wrow As Long '作業行
Dim wcol As Long '作業列
Dim drows(1) As Long '出の行の集まり
Dim trg_row As Long '交換用出の行
Dim exch_row As Long '入れ替え行
Dim dcount As Long '出の数
Dim tmp As String '一時保管
Dim exch_count As Long '入れ替え件数
exch_count = 0
Set ws = ActiveSheet
'全列繰り返し
For wcol = 3 To 9
dcount = 0
'全行繰り返し
For wrow = 4 To 14
'出の数をカウントする。
If ws.Cells(wrow, wcol).Value = "出" Then
If dcount < 2 Then
drows(dcount) = wrow
End If
dcount = dcount + 1
End If
Next
'出の数が2の場合
If dcount = 2 Then
'2つの出が所定時間の範囲内なら、2コマ以上開けた休の行を探す
If Check_Band(ws, wcol, drows, trg_row, exch_row) = True Then
tmp = ws.Cells(trg_row, wcol).Value
ws.Cells(trg_row, wcol).Value = ws.Cells(exch_row, wcol).Value
ws.Cells(exch_row, wcol).Value = tmp
exch_count = exch_count + 1
End If
End If
Next
MsgBox ("完了 入れ替え件数=" & exch_count)
End Sub
'2つの出が所定時間の範囲内かチェックし、範囲内であれば、交換対象の行を探す
Private Function Check_Band(ByVal ws As Worksheet, ByVal wcol, ByRef drows() As Long, ByRef trg_row As Long, ByRef exch_row As Long) As Boolean
Check_Band = False
exch_row = 0
Dim wrow As Long
'2つの出が連続していないなら終了
If drows(0) + 1 <> drows(1) Then Exit Function
'2つの出が9:00~13:00の範囲内の場合(2番目の出の行は連続しているのでチェックしない)
If drows(0) >= 4 And drows(0) < 8 Then
trg_row = drows(1)
'2コマ以上開けた休を探す(下方向へ検索)
For wrow = trg_row + 3 To 14
If ws.Cells(wrow, wcol).Value = "休" Then
exch_row = wrow
Exit For
End If
Next
End If
'2つの出が14:00~19:00の範囲内の場合(2番目の出の行は連続しているのでチェックしない)
If drows(0) >= 9 And drows(0) < 14 Then
trg_row = drows(0)
'2コマ以上開けた休を探す(上方向へ検索)
For wrow = trg_row - 3 To 4 Step -1
If ws.Cells(wrow, wcol).Value = "休" Then
exch_row = wrow
Exit For
End If
Next
End If
If exch_row > 0 Then Check_Band = True
End Function
tatsumaru77さんのように言葉での説明が下記のようなコードに結びつくようになるには、わたしには何が足りないのだろう?おそらく経験と想像力でしょう。
exch_count = exch_count + 1
For wrow = trg_row + 3 To 14
For wrow = trg_row - 3 To 4 Step -1
感服しました。ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) シフト表のコマで「ブロック」されている前の時間の「出」を同一列の「休」と入れ替えたいがふぇきません。 2 2023/08/02 18:49
- Visual Basic(VBA) 動きっぱなしです。止め方とプロシージャの間違いを教えて下さい! 5 2022/08/15 23:08
- Visual Basic(VBA) エラーコード1004 6 2022/06/09 14:12
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 4 2023/05/26 10:43
- Excel(エクセル) 日付で矢印マクロ 4 2023/07/25 16:47
- Excel(エクセル) 並べ替え、ソートの構文がわからない。 お世話になります。VBA超初心者です。 エクセルでワークシート 2 2023/06/28 21:00
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) excel2021で実行できないマクロ。どこを直したらいいのか 2 2022/03/28 03:40
- その他(Microsoft Office) エクセルのマクロでスライサー教えてください。 1 2022/09/28 16:40
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/07/04 17:58
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
au シークレット解除方法。
-
iPhoneのクイックアクションを...
-
除光液の正しい捨て方がわかり...
-
メッセージボックスを前面に表...
-
iPhoneのロック画面に出てくる...
-
【エフェクト】真空波
-
レーザのスポット径の計算式
-
至急です。 トイレに行きたいな...
-
再生中「巻き戻し」「早送り」...
-
C#でButtonのフォーカス枠を消...
-
Ubuntuで作業中、勝手にログア...
-
[化学基礎] μmのμはどうして...
-
スマホのバイブ使ってない方、...
-
go7の画面のタッチパネルの反応?
-
GoLiveのアニメーションにサウ...
-
パソコンの液晶画面にマジック...
-
Flashのフレームレート
-
ムーバ機種変更+FOMA新規購入+...
-
文字を一文字ずつ表示させるには
-
デュアルモニターにしてみたい...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
メッセージボックスを前面に表...
-
SPREAD(GrapeCity)のセルにフォ...
-
C#でButtonのフォーカス枠を消...
-
Excelのマクロで実行時エラー”1...
-
Chrome フォーカス時に枠が表示...
-
iPhoneのクイックアクションを...
-
コンボボックスの開いたリスト...
-
TDSマジックランプシアター 箱...
-
コンボボックスの三角を一時的...
-
レーザのスポット径の計算式
-
雷のようなアニメーションをウ...
-
DAMのデンモクの使い方
-
初期フォーカスについて
-
ASP.NETにてロストフォーカス処理
-
至急です。 トイレに行きたいな...
-
PowershellでCLIとISEの結果が違う
-
パソコンの液晶画面にマジック...
-
Eclipse Javaエディタでの選択...
-
手からビームって出せるんです...
-
除光液の正しい捨て方がわかり...
おすすめ情報