[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『セル「最終」の下のセル「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 >
すみません、元コード見てませんがこういうことですか?
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
前提があるなら提示しておいたほうがいいのでは?
(もこな2) 2023/08/10(木) 19:44:25
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
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
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
(麦茶) 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
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
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.