[[20230810183550]] 『セル「最終」の下のセル「a」とセル「STOP」を入ax(麦茶) ページの最後に飛ぶ

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

 

『セル「最終」の下のセル「a」とセル「STOP」を入れ替えたい』(麦茶)

検索したセルの入れ替えをしたいのですができません。
18の行にある「最終」を検索し、あればその下のセル「a」と
検索したセル「STOP」を入れ替えるため、下記コードのどこを変更すればよいか教えてください。

	A	B	C	D	E	F	G
9	a	a	a	a	a	a	a
10	a	a	a	a	a	a	a
11	休	a	a	STOP	a	a	a
12	a	休	a	a	a	a	a
13	昼	昼	昼	昼	昼	昼	昼
14	a	a	a	a	出	a	a
15	a	a	a	a	a	a	a
16	出	a	a	a	a	a	a
17	a	a	a	a	a	a	a
18	a	最終	a	a	休	a	a
19	a	a	a	a	a	a	a

Sub 最終STOPセット()

    Dim ws As Worksheet '対象シート(アクティブシート)
    Dim fnd1 As Range, fnd2 As Range
    Dim key1 As String, key2 As String
    Dim v As String
    Dim i As Long
    Dim exch_count As Long '入れ替え件数
    exch_count = 0
    key1 = "最終"
    key2 = "STOP"
    For i = 2 To 8
    Set fnd1 = Range(Cells(10, i), Cells(10, i)).Find(key1, LookAt:=xlWhole)
        If Not fnd1 Is Nothing Then
            If fnd1.Offset(1) = "C" Then
                Set fnd2 = Range(Cells(2, i), Cells(11, i)).Find(key2, LookAt:=xlWhole)
                If Not fnd2 Is Nothing Then
                    v = fnd1.Offset(1).Value
                    fnd1.Offset(1).Value = fnd2
                    fnd2.Value = v
                    exch_count = exch_count + 1
                    End If
                End If
            End If
        Next
    Next
    MsgBox ("完了 入れ替え件数=" & exch_count)
End Sub

< 使用 Excel:Microsoft365、使用 OS:Windows11 >


すいません
×If fnd1.Offset(1) = "C" Then
〇If fnd1.Offset(1) = "a" Then
でした。でもできません
(麦茶) 2023/08/10(木) 19:20:33

 すみません、元コード見てませんがこういうことですか?

 Sub test()
     Dim rng1 As Range, rng2 As Range
     With Range("A9").CurrentRegion
         Set rng1 = .Find(what:="最終", lookat:=xlWhole)
         Set rng2 = .Find(what:="STOP", lookat:=xlWhole)
         If rng1 Is Nothing Or rng2 Is Nothing Then Exit Sub
         rng2.Value = rng1.Offset(1, 0).Value
         rng1.Value = "STOP"
     End With
 End Sub
(フォーキー) 2023/08/10(木) 19:32:28

これは↓の続きですよね。
[[20230801185706]] 『キーを検索し上にあるセルをキーの下と入れ替えたい』(麦茶)

前提があるなら提示しておいたほうがいいのでは?

(もこな2) 2023/08/10(木) 19:44:25


フォーキーさん もこな2さん ありがとうございます。
 Sub 最終STOPセット()
    Dim rng1 As Range, rng2 As Range
    Dim v As String
    Dim exch_count As Long '入れ替え件数   
        exch_count = 0
        Set rng1 = Range(Cells(11, 2), Cells(11, 8)).Find(what:="最終", LookAt:=xlWhole)
        Set rng2 = Range(Cells(2, 2), Cells(11, 8)).Find(what:="STOP", LookAt:=xlWhole)
            If rng1 Is Nothing Or rng2 Is Nothing Then Exit Sub   
            v = rng1.Offset(1, 0).Value
            rng1.Offset(1, 0).Value = rng2
            rng2.Value = v           
        exch_count = exch_count + 1
      MsgBox ("完了 入れ替え件数=" & exch_count)
 End Sub
これでで入替えがきるようになりました。
(麦茶) 2023/08/11(金) 15:29:47

別の入れ替えになりますが、検索で「STOP」が見つかったら、同じ列の一番下19行目のセルと入れ替えるにはどのようにしたら良いか教えてください。

Sub STOP最終行へ()

    Dim rng1 As Range, rng2 As Range
    Dim v As String
    Dim exch_count As Long '入れ替え件数   
        exch_count = 0
        Set rng1 = Range(Cells(2, 2), Cells(11, 8)).Find(what:="STOP", LookAt:=xlWhole)
            If rng1 Is Nothing Then Exit Sub

        exch_count = exch_count + 1
      MsgBox ("完了 入れ替え件数=" & exch_count)
 End Sub

(麦茶) 2023/08/11(金) 15:36:55


 こうとか
 >rng1.Value = Cells(Cells(Rows.Count, rng1.Column).End(xlUp).Row, rng1.Column)
 >Cells(Cells(Rows.Count, rng1.Column).End(xlUp).Row, rng1.Column) = "STOP"

 以下気になる点
 >Cells(2, 2)
 最終STOPセットのコードにもありましたが、表は11行目からなのにB2セルはどこから出てきたんですか?

 >Range(Cells(11, 2), Cells(11, 8))
 >Range(Cells(2, 2), Cells(11, 8))
 個人的に、Cellsプロパティは行列を変数にして範囲を可変にするときに使用しています。
 上記のように範囲が固定されているのであれば、

 Range("B11:H11")
 Range("B2:H11)
 のほうがいいんじゃないでしょうか。

 コードについてはノーコメントで。
 一つ言えるのは、質問の際は実際に使用するレイアウトを使用したほうがいいです。
(フォーキー) 2023/08/11(金) 15:53:58

フォーキーさん 解りづらい説明ですいません。レイアウトは下記になります。
「STOP」を検索し、セルD8の「STOP」を見つけたら、同じD列の最終行のセルD12の「a」と
入れ替える。これがやりたいことになります。

	A_	B_	C_	D_	E_	F_	G_	H_
1_		あ	い	う	え	お	か	き
2_	9:00	a	a	a	a	a	a	a
3_	10:00	a	a	a	a	a	a	a
4_	11:00	休	休	a	a	a	a	a
5_	12:00	ブロック	休	a	a	a	a	a
6_	13:00	昼	a	a	a	昼	a	a
7_	14:00	a	a	a	a	出	a	a
8_	15:00	a	a	STOP	a	ブロック	a	a
9_	16:00	出	a	a	a	a	a	a
10_	17:00	a	a	a	a	a	a	a
11_	18:00	a	a	a	a	休	a	a
12_	19:00	a	a	a	a	a	a	a

(麦茶) 2023/08/11(金) 16:51:16


 わたしはこれまでとします。

 Sub test2()
     Dim rng As Range
     Set rng = Range("A1").CurrentRegion.Find(what:="STOP", lookat:=xlWhole)
     If rng Is Nothing Then Exit Sub
     rng.Value = Cells(.Row, rng.Column)
     Cells(Cells(Rows.Count, rng.Column).End(xlUp).Row, rng.Column) = "STOP"
 End Sub

 一部修正
(フォーキー) 2023/08/11(金) 17:17:00

フォーキーさん ありがとうございます。
なんだか文字化けしてしまいましたが、やりたいことを少し整理すると、
12行目で「STOP」を
Set rng1 = Range(Cells(12, 2), Cells(12, 8)).Find(what:="STOP", LookAt:=xlWhole)
で検索しなければ検索範囲を広げて
Set rng1 = Range(Cells(2, 2), Cells(11, 8)).Find(what:="STOP", LookAt:=xlWhole)
で「STOP」を検索し、見つけたら同じ列の12行目のセルと入れ替える。
目的は12行目に「STOP」が1個ある状態にする方法を教えてください。

(麦茶) 2023/08/12(土) 13:13:59


 ちょっと手が滑ったみたいですが、
 Cells(Cells(Rows.Count, rng.Column).End(xlUp).Row, rng.Column) = "STOP"
 の意味は理解されていますか。

 要するに、(STOPが)見つかった列のなかの、最終行を調べているのでしょう?
 それが分かりさえすれば、あとは自力でできるでしょう?
 もう何度もやっているじゃないですか。できないはずがないですよ。

(xyz) 2023/08/12(土) 14:10:10


xyzさん ありがとうございます。はい一旦は、下記でできたのですが
Sub STOP()
    Dim rng As Range
        With Range("A1").CurrentRegion
        Set rng = .Find(what:="STOP", lookat:=xlWhole)
            If rng Is Nothing Then Exit Sub
            rng.Value = Cells(Cells(Rows.Count, rng.Column).End(xlUp).Row, rng.Column)
            Cells(Cells(Rows.Count, rng.Column).End(xlUp).Row, rng.Column) = "STOP"
         End With
 End Sub
私の説明が足らず実際のシートは、1シートが週間になっています。図で示した表は1日分で、実際には図と同じレイアウトの表が月〜土まで5日分縦に並んでいます。最終行へもっていくと月曜日にあるSTOPが土曜日の最終行へ移動してしまいます。これを回避するためにはどのような修正すればよいか教えてください。

(麦茶) 2023/08/12(土) 17:14:40


 stopから下にジャンプすれば? 
(xyz) 2023/08/12(土) 17:41:02

 これ、ちょっとおかしくないですか?
  ↓
 >  Cells(Cells(Rows.Count, rng.Column).End(xlUp).Row, rng.Column) = "STOP"
      Cells(Rows.Count, rng.Column).End(xlUp) = "STOP"  
   と同じですよね?

 >図で示した表は1日分で、実際には図と同じレイアウトの表が月〜土まで5日分縦に並んでいます。
 縦に5日分?
 そうなると、1日分が何行目から何行目が分かる必要があります。
   A列の時間データが大小逆転した行が境目と判断するのですか?
   いつも「11行で1日分」と決まっているんですか? (2-12、13-23、・・)

(半平太) 2023/08/13(日) 09:48:53


あっ、本当ですね。
半平太さんありがとうございます。
(フォーキー) 2023/08/13(日) 09:54:36

    Sub main()
    Dim dic As Object, k As Variant, r As Range, c As Range, row As Long
    Set dic = CreateObject("scripting.dictionary")
    For Each c In Cells.SpecialCells(2)
        If c.Value = "STOP" Then dic(c.row & Chr(2) & c.Column) = True
    Next c
    For Each k In dic
        For Each d In Range("A" & Split(k, Chr(2))(0) & ":A" & Rows.Count).SpecialCells(2)
           If d.Offset(1).Value < d.Value Then row = d.row: Exit For
        Next d
        Cells(Split(k, Chr(2))(0) * 1, Split(k, Chr(2))(1) * 1).Value = Cells(row, Split(k, Chr(2))(1) * 1).Value
        Cells(row, Split(k, Chr(2))(1) * 1).Value = "STOP"
    Next k
    End Sub

(mm) 2023/08/14(月) 11:15:31


コメント返信:

[ 一覧(最新更新順) ]


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