プロが教える店舗&オフィスのセキュリティ対策術

シフト表のコマで「ブロック」されている前の時間の「出」を同一列の「休」と入れ替えたいがふぇきません。
テストで作った下記マクロで、「ブロック」の前のセルを「ブロック」の後へ移すところまではできたのですが、
①「出」の条件と
②入れ替える「休」の条件、
③検索する範囲の指定
が解らずできません。
どのように指定したら良いか教えてください。
(実行例)
Range("C5")の「出」は「ブロック」の前にあるのでRange("C9")の「休」と入れ替える。

Sub test()
Dim fnd As Range
Dim key As String
Dim v As Variant
key = "ブロック"
Set fnd = Range("C:C").Find(key, LookAt:=xlWhole)
If fnd Is Nothing Then Exit Sub
v = fnd.Offset(-1).Value
fnd.Offset(-1).Value = fnd.Offset(1).Value
fnd.Offset(1).Value = v
End Sub

「シフト表のコマで「ブロック」されている前」の質問画像

A 回答 (2件)

1例です。


1.3行から13行まで、下記を繰り返します。
①ブロック出現なしの状態で出が出現したら、その行を記憶
②ブロックが出現したら、そのことを記憶(ブロック出現有とする)
③ブロック出現有の状態で休が出現したら、その行を記憶(但し1回限り)
2.出の行、休の行が共に記憶されているなら、入れ替えを行う

Public Sub 出休()
Dim ws As Worksheet '対象シート(アクティブシート)
Dim wrow As Long '作業行
Dim wcol As Long '作業列
Dim 出_row As Long '交換用出の行
Dim 休_row As Long '交換用休の行
Dim Block As Boolean 'ブロック出現の有無
Dim temp As String '一時保管
Dim sval As String 'セルの値
Set ws = ActiveSheet
wcol = 3 '作業列を3列に設定
出_row = 0
休_row = 0
Block = False
For wrow = 3 To 13
sval = ws.Cells(wrow, wcol).Value
If sval = "ブロック" Then
Block = True
End If
If sval = "出" And Block = False Then
出_row = wrow
End If
If 休_row = 0 And sval = "休" And Block = True Then
休_row = wrow
End If
Next
If 出_row > 0 And 休_row > 0 Then
temp = ws.Cells(出_row, wcol).Value
ws.Cells(出_row, wcol).Value = ws.Cells(休_row, wcol).Value
ws.Cells(休_row, wcol).Value = temp
End If
End Sub
    • good
    • 0
この回答へのお礼

tutumaru77さん
いつもお考えいただきありがとうございます。
助かりますえ

お礼日時:2023/08/07 17:52

まず。


>「出」を同一列の「休」と入れ替えたいがふぇきません。

入れ替える条件が不明。以前の質問の続きだから省いているのでしょうけど、自作自演と疑われる可能性があるので避けた方が宜しいかと。
過去質のリンクを貼る等で対応可能では?
プロフィールでは非公開ですし、過去にさかのぼって探すのは大変。
既出の質問の回答者向けに質問しているのなら上記を危惧されそう。
知恵袋でも回答者の指名は辞めたぐらいですし。


・実行例が少なすぎる。

上記と合わせるとどう言う条件でどうしたいのかが不明。
特に「ブロック」と「出」の位置関係が過去の質問と相違するのならば、それらについて詳しく記載するか画像にて解説が必要かなと。

>Range("C5")の~

とするのなら列の表示はアルファベットの方が親切かも?
    • good
    • 0
この回答へのお礼

Sub test2()
Dim fnd1 As Range, fnd2 As Range
Dim key1 As String, key2 As String
Dim v As Variant
key1 = "ブロック"
 key2 = "休"
Set fnd1 = Range("C:C").Find(key1, LookAt:=xlWhole)
 Set fnd2 = Range("C:C").Find(key2, LookAt:=xlWhole)
If fnd1.Offset(-1) = "出" Then
If fnd1 Is Nothing Then Exit Sub
v = fnd1.Offset(-1).Value
fnd1.Offset(-1).Value = fnd2
fnd2.Value = v
End If
End Sub
①②までできました!
あとは③検索範囲ですが誰も教えていただけないようなのでがんばります。

お礼日時:2023/08/03 21:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!