[[20190205234302]] 『下記のコードをループさせたいのです』(なのれい) ページの最後に飛ぶ

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

 

『下記のコードをループさせたいのです』(なのれい)

いつもお世話になっております。

皆様のおかげで基本的なセルの移動を出来る様になりました。
下記のコードをループさせたいのですが、出来ずに苦戦しております。

 Sub 移動準備()
    Dim rng As Range, rng2 As Range
    Set rng = Range("A2:A350").Find("1", Lookat:=xlWhole)

    Set rng2 = Range("B2:B350").Find("1", Lookat:=xlWhole)

    rng.Offset(0, 2).Cut rng2.Offset(0, 2)

 End Sub

FindNEXTをどの様に使うべきなのか、はたまたFor i = 1 To 320なのか、 DO LOOPなのか
どれを使うのかわからない状態です。

イメージ的には

 Sub 移動準備()
    Dim rng As Range, rng2 As Range
    Set rng = Range("A2:A350").Find("i = 1 To 320", Lookat:=xlWhole)

    Set rng2 = Range("B2:B350").Find("i = 1 To 320", Lookat:=xlWhole)

    rng.Offset(0, 2).Cut rng2.Offset(0, 2)

 End Sub

この様にしたいのですが、アドバイス頂けないでしょうか?
宜しくお願い致します。

< 使用 Excel:Excel2013、使用 OS:Windows10 >


FindNextメソッドについては、とりあえず個人的には↓のサイトの方が説明がわかりやすいと思ったので紹介しておきます。
http://officetanaka.net/excel/vba/tips/tips123.htm

あとイメージってことですが、そもそものFindメソッドの使い方がわかっていなさそうなので↓から先に見たほうがよいかも
http://officetanaka.net/excel/vba/cell/cell11.htm

そのうえで、Findメソッドの引数を省略するのは↓のようなことになるのでオススメしません。
検索に失敗するとき(Findメソッドの引数省略時に起きる失敗)
https://www.moug.net/tech/exvba/0150111.html

(もこな2) 2019/02/06(水) 00:25


もこな2さんいつもありがとうございます。

URLを参考にして作ってみます。
ありがとうございます。
(なのれい) 2019/02/06(水) 00:30


■For〜Next(繰り返し処理)の構文

 Dim i(実際はiでなくてもOKですが最初はiで覚えましょう) 
 For i = 最初の数字 To 最後の数字
   処理内容
 Next i

 このように書くことで、処理内容を繰り返し処理することができます。
 繰り返しながらiは 1ずつ増えていき、
 i が最後の数字に達したら繰り返し処理を終わります。

 なのれいさんは、Findメソッドの検索する値を
 1 から 320 まで増やしながら繰り返したいのですよね? 

 でしたらこのようになります。

 Sub 移動準備()
    Dim rng As Range, rng2 As Range, i As Long
    For i = 1 To 320
        Set rng = Range("A2:A350").Find(i, Lookat:=xlWhole)
        Set rng2 = Range("B2:B350").Find(i, Lookat:=xlWhole)
        rng.Offset(0, 2).Cut rng2.Offset(0, 2)
    Next i
 End Sub

(TAKA) 2019/02/06(水) 09:21


 おはよ〜ございます。 ^^
B列の数値の小さい方から大きい方へ順に並び替え
ておられるのでせうか。
だとすれば
並び替えたい順に番号振る手間はいりますすが。。。
Sort
なども
使えるのではないでしょうか。
いらぬお世話でしたら済みません。m(__)m
マクロ。。。楽しいですね ^^v
でわ

(隠居じーさん) 2019/02/06(水) 09:56


 追伸
私の勘違いだったみたいで。。。 ( ̄▽ ̄;)
無視してください。
コード処理の練習みたいで楽しかったです
お邪魔しました。
すみません

(隠居じーさん) 2019/02/06(水) 10:02


TAKAさんいつもありがとうございます。

こちらのコードも帰宅したらすぐに勉強させて頂きます。
ありがとうございます。

隠居じーさんさんコメントありがとうございます。

移動後の場所のセルが空で無ければ撤去(全く違う列へ)
空であれば入れる

というルールで
並び替えだと上手くいかないんです。

めっちゃ初心者ですけど、少しずつ理解出来る所も増えて楽しいです。
どんなコメントでもお待ち致しております。

(なのれい) 2019/02/06(水) 11:54


 皆様お疲れ様です。

Sub 移動準備()

    Dim rng As Range, rng2 As Range, i As Long
    For i = 1 To 320
        Set rng = Range("A2:A350").Find(i, Lookat:=xlWhole)
        Set rng2 = Range("B2:B350").Find(i, Lookat:=xlWhole)
        rng.Offset(0, 2).Cut rng2.Offset(0, 2)
    Next i
 End Sub

文字がなかった場合エラーが起きてしまい、つまずいてしまいました。

If rng Is Nothing Then
  MsgBox "みつかりませんでした。"
 Else
  MsgBox rng.Row
 End If

とか

 If Not Rng Is Nothing Then
        Rng.Font.Bold = True
    End If

などNothingについて調べてみましたが、上手く出来ませんでした。
アドバイス頂けないでしょうか?
(なのれい) 2019/02/06(水) 21:50


>文字がなかった場合エラーが起きてしまい、つまずいてしまいました。

んっと、、、
http://officetanaka.net/excel/vba/cell/cell11.htm
↑の【Findメソッドで見つからなかったとき】

のところには目を通しましたか?
(もこな2) 2019/02/06(水) 22:43


あと、前回検索如何によっては、文字があってもエラーになりますよ。

 検索に失敗するとき(Findメソッドの引数省略時に起きる失敗) 
https://www.moug.net/tech/exvba/0150111.html 

(もこな2) 2019/02/06(水) 22:45


もこな2さん返信ありがとうございます。

目を通しましたが、理解できませんでした。
一応出来る限りやってみようと思い、下記のコードにしましたがやはりダメでした。

 Sub 移動準備?A()
    Dim FoundCell  As Range, rng2   As Range, i As Long
    For i = 1 To 320
        Set FoundCell = Range("E2:E305").Find(i, Lookat:=xlWhole)
        Set rng2 = Range("A2:A305").Find(i, Lookat:=xlWhole)

        rng2.Offset(0, 1).Cut FoundCell.Offset(0, 2)

    Next i
        If FoundCell Is Nothing Then
        MsgBox "検索に失敗しました"
    Else
        FoundCell.Select
    End If

 End Sub
(なのれい) 2019/02/06(水) 23:18

 最初のA列,B列を検索、C列をD列へ移動のパターンで。。。
見当違いでしたら済みません。
処理対象シート名。。。Sheet1

 Option Explicit
Sub 移動準備()
    Dim rng As Range
    Dim rng2 As Range
    Dim i As Long
    Dim lastrow
    Dim buf As String
    Dim tflg As Boolean
    With Worksheets("Sheet1")
        lastrow = .Cells(.Rows.Count, 1).End(xlUp).Row
        For i = 1 To lastrow
            Set rng = .Range("A2:A" & lastrow & "").Find(i, , xlValues, xlWhole, xlByRows, , False, True, False)
            Set rng2 = .Range("B2:B" & lastrow & "").Find(i, , xlValues, xlWhole, xlByRows, , False, True, False)
            If rng Is Nothing Or rng2 Is Nothing Then
                If i < lastrow Then
                    buf = buf & i & vbCrLf
                    tflg = True
                End If
            Else
                rng.Offset(0, 2).Cut rng2.Offset(0, 2)
            End If
        Next i
    End With
    If tflg Then MsgBox buf & "行目の情報が不適切な可能性が有ります。"
 End Sub

 おやすみなさい m(_ _)m。。。。。zzzzzzz
(隠居じーさん) 2019/02/06(水) 23:43

う〜ん。ちょっと難しいですかね
いきなりゴール(やりたいこと)を目指すのもアリですが、とりあえず確認がてら整理してみましょう。

(1)「test1」は何をやっているかわかりますか?↓の【】を埋めてください

 アクティブシートのセル範囲(E2:E305)から【   】を探して、
 変数FoundCellに代入ではなく【   】そのものをセットしている。

(2)「test1」で該当セルが見つからない場合、変数FoundCellには何が入って(セット)されますか?

    Sub test1()
        Const i As Long = 1
        Dim FoundCell As Range

        Set FoundCell = Range("E2:E305").Find(i, LookIn:=xlValues, Lookat:=xlWhole)
    End Sub

 ※上記コードは標準モジュールに記述されているものとする。

(もこな2) 2019/02/07(木) 00:21


もこな2さん返信ありがとうございます。

 アクティブシートのセル範囲(E2:E305)から【  i 】を探して、
 変数FoundCellに代入ではなく【 数値  】そのものをセットしている。

(2)に関してですが、わかりません。

(なのれい) 2019/02/07(木) 01:02


(1)は違います。
 アクティブシートのセル範囲(E2:E305)から【セルの「値」が1となっている「セル」】を探して、
 変数FoundCellに代入ではなく【セル 】そのものをセットしている。

です。
(1)、(2)共に、↓をもう一度よく読んでください。
http://officetanaka.net/excel/vba/cell/cell11.htm

とくにこの部分

Findメソッドは、引数Whatに指定した検索値が見つかった場合は、見つかったセル(Rangeオブジェクト)を返します。

見つからなかった場合はNothingという特別な状態を返します。

というわけで、(2)の正解は、Nothing です。
そのうえで、こんなところにも注目しましょう。

重要なことは「Nothingはセル(Rangeオブジェクト)ではない」ということです。セル(Rangeオブジェクト)ではないのですから、当然Selectメソッドで選択することもできません。

上記は、Selectメソッドの例で書いてありますが、コピー、切取り、貼付も無理です。
なぜなら【セル】じゃないので・・・

ということで、Range型変数の中身がNothingだった場合、コピーや切取り、貼付はできないわけですから、

 もし、○○がNothingだったら、プログラム終了

というような命令は、cutなどをする命令より【前の行】で記述しなければなりません。

(もこな2) 2019/02/07(木) 02:59


もこな2さん返信ありがとうございます。

了解致しました。
上記の事を踏まえてもう一度作り直してみます。

隠居じーさんさん返信ありがとうございます。

時間少なくてまだ軽くしか見れていないのですが、思い通りに動いてくれてました。
Nothingの件が理解出来たら、もう一度深く調べて自分のものに出来る様頑張ります。
ありがとうございます。
(なのれい) 2019/02/07(木) 09:51


 Sub 移動準備?A()
    Dim FoundCell  As Range, rng   As Range, i As Long
    For i = 1 To 320
        Set FoundCell = Range("E2:E305").Find(i, Lookat:=xlWhole)
        Set rng = Range("A2:A305").Find(i, Lookat:=xlWhole)
        If FoundCell Is Nothing Then

        Else
        rng.Offset(0, 1).Cut FoundCell.Offset(0, 2)
        End If
    Next i
 End Sub

もこな2さん上記のコードで上手くいきました。

    If FoundCell Is Nothing Then

       無かった時の処理、メッセージはいらないので何もないです。
        Else
        rng.Offset(0, 1).Cut FoundCell.Offset(0, 2) あった時の処理

Rangeオブジェクトなので、Setステートメントを使わないといけない。
If文でNothingの判定を行うにはIs演算子。

もこな2さんこちらでいかがでしょうか?

(なのれい) 2019/02/07(木) 19:16


>もこな2さんこちらでいかがでしょうか?

■まず、1点目としてダメではないですが、↓の部分について

 If FoundCell Is Nothing Then 
    '無かった時の処理、メッセージはいらないので何もないです。
 Else
    rng.Offset(0, 1).Cut FoundCell.Offset(0, 2) あった時の処理
 End IF

↓でも書きましたけど
[[20190205021012]] 『VBAで複数選択し、切り取り貼り付けしたいです』(なのれい)

 If Not FoundCell Is Nothing Then 
    rng.Offset(0, 1).Cut FoundCell.Offset(0, 2) 'あった時の処理
 End IF

としたほうが見やすいと思います。

■2点目として、
Findメソッドの結果が見つからなかったであれば、Nothingが返されるのは説明の通りです。
そうすると、

 Set FoundCell = Range("E2:E305").Find(i, Lookat:=xlWhole)

↑が見つかってない場合 【FoundCell】にはNothignが入ってますよね
その考えで、↓が見つからない場合、【rng】の中身はなんですか?

 Set rng = Range("A2:A305").Find(i, Lookat:=xlWhole)

踏まえると、下記の部分ちょっとまずいですよね。修正してみましょう。
(すでに隠居じーさんさんが答えを投稿されているので、答えがわからなければ研究されるとよいです。)

 If Not FoundCell Is Nothing Then 
    rng.Offset(0, 1).Cut FoundCell.Offset(0, 2) 'あった時の処理
 End IF

■3点目として
↓は読んでいただけましたか?

 検索に失敗するとき(Findメソッドの引数省略時に起きる失敗) 
https://www.moug.net/tech/exvba/0150111.html 

そうすると、例えば↓は【値】が1のセルがあっても、【前回検索の状況によっては】見つからないことがあるのはわかりますよね?

 Set rng = Range("A2:A350").Find(1, Lookat:=xlWhole)

■4点目として
そもそも、どんなものを処理されようとしているのかよくわからないので、簡単なレイアウト(5行分くらい)の提示があると回答しやすいです。
個人的には、
・Findメソッドで検索をする必要性が薄い気がしてならない
・そもそも、検索をする必要がないんじゃないか
と思ったりしてます

■5点目として
4点目と関連しますが、検索対象に合致するものが複数あったりしますか?
For i = 1 To 320 のときに 2〜305行目を処理なので重複がないとしても、1〜320のうち無いものがあるのはわかりますが、条件に合致するものが対象が複数ある場合、上手くいったというコードではちょっとまずいと思います。
Findメソッドは、最初に見つかった1セルしか返しませんから・・・

(もこな2) 2019/02/08(金) 06:35


■オマケ
検索対象の1行(列)の中に、条件の【値】に合致するものが1つしかないって場合は、ワークシート関数のMATCH関数が使えます。
ただし、MATCH関数で見つからない場合エラーになる点には注意が必要です。

例えば、A2:A305のなかから、値が「1」のセル(例えばA11に条件に合致するものがある)を探す場合

    Sub さんぷる1()
        Dim buf As Long

        With Range("A2:A305")
            buf = WorksheetFunction.Match(1, .Cells)

            MsgBox .Cells(buf).Address(0, 0) & " で発見しました。"
        End With

    End Sub

いろいろ手抜きしてますが、こんな感じでOKです。
問題は見つからない(条件に合致するものがない)場合です、
見つからない場合、上記では

 buf = WorksheetFunction.Match(1, .Cells)

この部分で実行時エラーが発生します。
なのでエラーを無視・・・・としてもよいのですがこのようにする方法もあります。

    Sub さんぷる2()
        Dim buf As Variant '←Variant型(なんでも型)で宣言

        With Range("A2:A305")
            buf = Application.Match(1, .Cells)

            If Not IsError(buf) Then 'bufがエラー値であるか(の反対であるか)判定
                MsgBox .Cells(buf).Address(0, 0) & " で発見しました。"
            End If
        End With

    End Sub

↑このように修正すると、MATCH関数がエラーになった場合、実行時エラーが発生するのではなく、エラー値というものを取得するようになります。
あとは、エラー値じゃなかったら処理するようにしてやればよいです。

蛇足話ですが、Findメソッドが【セル】を探すのに対して、MATCH関数は、【値】が【何番目】にあるかを探すという違いはありますが、一口に検索と言ってもいろんな方法があるということでご理解ください。

(もこな2) 2019/02/08(金) 07:33


 これでいいのかな、、

 Sub 移動準備()
    Dim rng As Range, rng2 As Range, i As Long
    For i = 1 To 320
        Set rng = Range("A2:A350").Find(i, Lookat:=xlWhole)
        Set rng2 = Range("B2:B350").Find(i, Lookat:=xlWhole)
        If Not rng Is Nothing And Not rng2 Is Nothing Then
            rng.Offset(0, 2).Cut rng2.Offset(0, 2)
        End If
    Next i
 End Sub

(TAKA) 2019/02/08(金) 10:03


■戻り値
 Findメソッド(検索の命令)はちょっと特殊で、【戻り値】がある命令です。

 例えばSelectメソッド(選択)は選ぶことが目的であり、選ぶことで完結する命令です。
 他にもDeletメソッド(削除)なんかも消すことが目的であり、消すことで完結する命令ですよね?
 こういう命令には戻り値はありません。

 ただ、検索の場合はどうでしょうか。
 探すことが目的で、探すことで完結する命令ですか?

 違います。探すだけでは何も起きません。

 例えば部下に「あの書類を探してきてくれ」と頼んで、
 部下が探して終わってしまっては困ります。
 探して、見つかったなら持ってきて欲しいし、
 見つからなかったなら報告が欲しいですよね?
 探すだけでは困ります。

 探して、見つかったセルを扱いたいから、検索するわけですよね?

 そのため、Findメソッドは検索を行うだけではなく、
 見つかったセルを【戻り値】として返します。

 Set rng =  Range("A2:A350").Find(i, Lookat:=xlWhole)

 と書くことで、A2からA350の範囲からi を探して、
 戻り値、つまり見つかったセルを 変数rngに格納します。

 なので、たとえばi が A200 にあったとしたら、rngにはA200 が格納されます。

 じゃあもしも
探しても見つからなかったら
 どうなるのでしょうか。

 その場合は Findメソッドは【 Nothing 】という戻り値を返します。
 日本語で言えば、「探したけど無かったよ〜」ということです。
 そうするとrng には Nothing が入るということになりますよね?

 Nothing は状態であって、オブジェクトではありません。

 Select , Cut , Copy , Delete などの命令はオブジェクトに対して行うものなので
 rng.Offset(0,2).Cut
 と書いた場合、rngにきちんとオブジェクトが入っていれば機能しますが
 rngがNothingの時にはエラーになります。

 そのため、Findメソッドを使う際には
 なかったときのことを考えて、次のように条件分岐で書くのが基本です。

    Dim rng As Range
    Set rng = Range("A2:A350").Find("1", Lookat:=xlWhole)
    If rng Is Nothing Then
        '見つからなかった場合の処理
    Else
        '見つかった場合の処理
    End If

(TAKA) 2019/02/08(金) 10:43


 >例えばSelectメソッド(選択)は選ぶことが目的であり、選ぶことで完結する命令です。
 >他にもDeletメソッド(削除)なんかも消すことが目的であり、消すことで完結する命令ですよね?
 >こういう命令には戻り値はありません。
 処理が成功した場合にTRUEを戻り値としているようだ。

(ねむねむ) 2019/02/08(金) 10:59


 ヘルプではRange.Selectでは戻り値:バリアント型となっている。
 Worksheet.Selectでは戻り値があるとの記載がないが実際にはイミディエイトウィンドウで
 ?Worksheets("Sheet1").Select
 などとするとTrueと返ってくる。

(ねむねむ) 2019/02/08(金) 11:02


 Sub A()
    Dim B
    B = Range("A1").Select
    MsgBox B
 End Sub

 ほんとだ、、知りませんでした、、
 名前付き引数が括弧でくくられていなくても戻り値がある場合があるとは、、

(TAKA) 2019/02/08(金) 11:05


 ひょっとすると全ての命令に戻り値があるのかな、、
 色々試してみます、ありがとうございました。

(TAKA) 2019/02/08(金) 11:11


 引数を指定する場合のみ、
 【戻り値を使うなら】引数を括弧で囲む必要がある

 ってことか。理解しました。

 >なのれいさん
 間違ったことをぺらぺらとすみませんでした、、
 穴があったら入りたい、、
(TAKA) 2019/02/08(金) 11:27

皆様回答遅れて申し訳ありません。

現在、皆様の思考についていけない状態でいっぱいいっぱいですので回答漏れありましたら連絡頂ければと思います。

それでは、
もこな2さん返信ありがとうございます。
1点目
・了解致しました。修正致します。

2点目
・If Not rng Is Nothing 付け足す。
もしくは
If Not FoundCell Is Nothing Then
If Not rng Is Nothing
を組み合わせたコードにする必要がある。

3点目
・数式だとダメという事を仰っているのでしょうか?検索する列は数値か空白のどちらかになっております。

4点目
・次のコメントに記載いたします。

5点目
・検索する数値は1つしかないです。1が重複、2が重複…する事はありません。

ねむねむさん、TAKAさん
返信ありがとうございます。
すみませんが、理解できる様頑張ります。

皆様ありがとうございます。
次のコメントでエクセルの表の説明致します。

(なのれい) 2019/02/08(金) 12:44


 Sub 移動準備?A()
    Dim FoundCell  As Range, rng   As Range, i As Long
    For i = 1 To 570
        Set FoundCell = Range("E2:E305").Find(i, Lookat:=xlWhole)
        Set rng = Range("A2:A305").Find(i, Lookat:=xlWhole)
        If Not FoundCell Is Nothing Then
        rng.Offset(0, 1).Cut FoundCell.Offset(0, 2)
        End If
    Next i
 End Sub

訂正
・For i = 1 To 570
・If Not FoundCell Is Nothing Then

    A    B    C    D     E       F    G      H       I  J
1       現場所       移動先         撤去商品
2   1  商品名
3   2   
4   3   
5   5
6   6
7   7
8   8
9   10
・
・
・
・
・
305 570

訂正
・For i = 1 To 570
・If Not FoundCell Is Nothing Then

A列には4と9が抜けた1〜570の商品棚番号が入ってます。
B列には棚に入ってる商品名が入ります。
E列にはB列の商品の移動先の番号が入り、F列には移動する商品名が入ります。(今回のコードの件)
F列に商品があり、尚且つB列にも商品があれば、B列は撤去なのでH列へ移動になります。
F列に商品があったら、B列に移動します。
B列に空白が残ると思いますが、そちらは新商品を入力していきます。

以上になります。

(なのれい) 2019/02/08(金) 13:26


 こんにちは ^^
多少問題ありのコードの様な気がしないでもありませんが。
ラスト行取得は一つでよかったかも。。。
何かの参考にでも。。。
合ってるかどうかは解りません。。。( ̄▽ ̄;)。。。m(_ _)m

 Sheet1 に下記の実験データー

      A    B         C   D   E        F              G   H
   1       現場所    A   B   移動先   移動商品       C   撤去商品
   2    1  商品B2                  3
   3    2  商品B3                  4
   4    3  商品B4                  5
   5    5  商品B5                  6  きつね
   6    6                          7  うどん
   7    7  商品B7                  8  プルドビーフ
   8    8  商品B8                  9
   9   10  商品B9                 10
  10   11  商品B10                11
  11   12  商品B11                12
  12   13  商品B12                13
  13   14  商品B13                14
  14   15  商品B14                15  たぬき
  15   16  商品B15                16
  16   17  商品B16                17
  17   18                         18  そば
  18   19                         19  からあげ
  19   20  商品B19                20
  20   21  商品B20                21

 Sheet1 このように、なりましたよ。^^

      A    B          C   D   E        F              G   H
   1       現場所     A   B   移動先   移動商品       C   撤去商品
   2    1  商品B2                   3  商品B4
   3    2  商品B3                   4
   4    3                           5  商品B5
   5    5                           6
   6    6  きつね                   7  うどん             商品B7
   7    7                           8  プルドビーフ       商品B8
   8    8                           9
   9   10                          10  商品B9
  10   11                          11  商品B10
  11   12                          12  商品B11
  12   13                          13  商品B12
  13   14                          14  商品B13
  14   15                          15  たぬき             商品B14
  15   16                          16  商品B15
  16   17                          17  商品B16
  17   18  そば                    18
  18   19  からあげ                19
  19   20                          20  商品B19
  20   21                          21  商品B20

 Option Explicit
Sub main()
    Dim sh01 As Worksheet
    Dim i As Long
    Dim j As Long
    Dim A_lastr As Long
    Dim F_lastr As Long
    With Worksheets("Sheet1")
        A_lastr = .Cells(.Rows.Count, 1).End(xlUp).Row
        F_lastr = .Cells(.Rows.Count, 5).End(xlUp).Row
        For i = 2 To A_lastr
            For j = 2 To F_lastr
                If .Cells(i, 1) = .Cells(j, 5) Then
                    If (.Cells(i, 2) <> "") * (.Cells(j, 6) = "") Then
                        .Cells(i, 2).Cut .Cells(j, 6)
                    ElseIf (.Cells(i, 2) = "") * (.Cells(j, 6) <> "") Then
                        .Cells(j, 6).Cut .Cells(i, 2)
                    ElseIf (.Cells(i, 2) <> "") * (.Cells(j, 6) <> "") Then
                        .Cells(i, 2).Cut .Cells(j, 8)
                    End If
                End If
            Next
        Next
    End With
End Sub
(隠居じーさん) 2019/02/08(金) 16:26

 Dim sh01 As Worksheet
は消し忘れです。済みません。
消してくださいね。

 A^_^;

 m<< _ _ >>m
(隠居じーさん) 2019/02/08(金) 16:35

■1点目
 好みの問題ですからまぁ参考程度で。

■2点目

 隠居じーさんさんの 
 If rng Is Nothing Or rng2 Is Nothing Then
    ↑を参考に↓のようにしてみては?
 If Not FoundCell Is Nothing And Not rng Is Nothing Then

 ※ちょっと例がわかりづらかったかも。ごめんなさい。

■3点目
↓を貼り付けてそのまま実行してみてください。

     Sub 実験用()
        Dim FoundCell  As Range
        Const i As Long = 1

        Set FoundCell = Range("E2:E305").Find(i, LookIn:=xlComments, Lookat:=xlWhole)
        '↑と↓で違うところはどこでしょうか?
        Set FoundCell = Range("E2:E305").Find(i, Lookat:=xlWhole)

        If FoundCell Is Nothing Then
            MsgBox "みつかりません"
        Else
            MsgBox FoundCell.Address(0, 0) & " がヒットしました"
        End If

     End Sub

あるはずなのに「みつかりません」って出ませんか?

■4点目
レイアウトって言ったのがまずかったです。
処理前の状況がどんな感じで、処理後にどうなってほしいのかっていうのを示してほしいという意味です。

■5点目
該当セルは複数存在しないのですね。
であれば【FindNextメソッド】は、今回は関係ないです。

(もこな2 ) 2019/02/08(金) 16:56


隠居じーさんさんコードありがとうございます。

 Sub 移動準備?A()
    Dim FoundCell  As Range, rng   As Range, i As Long
    For i = 1 To 570
        Set FoundCell = Range("E2:E305").Find(i, Lookat:=xlWhole)
        Set rng = Range("A2:A305").Find(i, Lookat:=xlWhole)
        If Not FoundCell Is Nothing And Not rng Is Nothing Then
        rng.Offset(0, 1).Cut FoundCell.Offset(0, 2)
        End If
    Next i
 End Sub

Sub 撤去()

    Dim i As Long
    For i = 2 To 570
        If Cells(i, "G") = "" Then
        Else
            Cells(i, "B").Cut Cells(i, "J")
        End If
    Next i
 End Sub
  Sub 移動完了()
     Dim i As Long
    For i = 2 To 570
        If Cells(i, "G") = "" Then
        Else
            Cells(i, "G").Cut Cells(i, "B")
        End If
    Next i
 End Sub

今現在私が作れてるコードです。
E列には違うプログラムで数値を貼り付けしてきます。

訂正
E列には移動前の番号か、空白が入ります。

E列の番号の商品を、その表示された行のB列に移動したいです。

もこな2さん返信ありがとうございます。

上記のコードの移動準備が今のところ成功しています。

A列 4と9を含まない 1〜570が入ります。
E列 移動前の番号が移動先の行のE列に入ります。

皆様上手く伝えれなくて申し訳ありません。

(なのれい) 2019/02/08(金) 17:13


レイアウトの件忘れてました。

作業前

    A    B    C    D     E       F    G      H       I  J
1       現場所       移動先         撤去商品
2   1  ラーメン
3   2   ご飯
4   3   肉          2
5   5  魚

作業後1

    A    B    C    D     E       F    G      H       I  J
1       現場所       移動先         撤去商品
2   1  ラーメン
3   2   
4   3   肉          2    ご飯
5   5  魚

作業後2

    A    B    C    D     E       F    G      H       I  J
1       現場所       移動先         撤去商品
2   1  ラーメン
3   2   
4   3             2    ご飯       肉
5   5  魚

作業後3

    A    B    C    D     E       F    G      H       I  J
1       現場所       移動先         撤去商品
2   1  ラーメン
3   2   
4   3   ご飯          2           肉
5   5  魚

こんな感じで成功になります。
(なのれい) 2019/02/08(金) 17:20


     A   B          C   D   E        F   G   H         
  1      現場所     C   D   移動先   F   G   撤去商品  
  2   1  らーめん                                      
  3   2  ご飯                                          
  4   3  肉                       2                    
  5   5  魚                                            

 で。。。^^ きっともっとスマートな方法は有るとは思いますが。。。^^;

 Option Explicit
Sub Front_Proc()
    Dim i As Long
    Dim j As Long
    Dim A_lastr As Long
    With Worksheets("Sheet1")
        A_lastr = .Cells(.Rows.Count, 1).End(xlUp).Row
        For i = 2 To A_lastr
            For j = 2 To A_lastr
                If .Cells(i, "A") = .Cells(j, "E") Then
                    .Cells(i, "B").Cut .Cells(j, "F")
                End If
            Next
        Next
    End With
    proc_1
    proc_2
End Sub
Private Sub proc_1()
    Dim i As Long
    Dim lastr As Long
    With Worksheets("Sheet1")
        lastr = .Cells(.Rows.Count, 1).End(xlUp).Row
        For i = 2 To lastr
            If .Cells(i, "F") <> "" And .Cells(i, "B") <> "" Then
                .Cells(i, "B").Cut .Cells(i, "H")
            End If
        Next
    End With
End Sub
Private Sub proc_2()
    Dim i As Long
    Dim lastr As Long
    With Worksheets("Sheet1")
        lastr = .Cells(.Rows.Count, 1).End(xlUp).Row
        For i = 2 To lastr
            If .Cells(i, "F") <> "" Then
                .Cells(i, "F").Cut .Cells(i, "B")
            End If
        Next
    End With
End Sub
(隠居じーさん) 2019/02/08(金) 19:33

編集かぶったけど確認です。

ラーメンが動かないのはE列に1が無いからですか?
肉が、G列に動くのは、その行のF列がブランクで無いためという理解でよいですか?

(もこな2 ) 2019/02/08(金) 19:43


こんばんは〜 ^^
解らない点の確認ですが
G列って処理対象でしたっけ???

(隠居じーさん) 2019/02/08(金) 20:02


ラーメンが動かないのはE列に1が無いからですか?
仰る通りです。

肉が、G列に動くのは、その行のF列がブランクで無いためという理解でよいですか?
F列にご飯があるからG列に移動です。

すみません。上の図だとH列になってます。
撤去は正直どこの列でも構わないです。
私のコードがG列で図がH列で間違いです。申し訳ありません。
(なのれい) 2019/02/08(金) 20:08


H列とG列の件はごめんなさい。私が見間違えてますね。

その条件であれば、こんな感じでもいけそう。

    Sub さんぷる()
        Dim MyRNG As Range
        Dim buf As Variant
        Dim tmp As Range

        Stop '←ここで止まるのでステップ実行して研究のこと

        With ActiveSheet

            '▼作業1
            For Each MyRNG In .Range("B2", .Cells(.Rows.Count, "B").End(xlUp))
                buf = Application.Match(MyRNG.Offset(, -1).Value, .Range("E:E"), 0)
                If Not IsError(buf) Then
                    MyRNG.Cut .Cells(buf, "F")
                End If
            Next MyRNG

            '▼作業2
            On Error Resume Next
            Set tmp = .Range("F:F").SpecialCells(xlCellTypeConstants, xlNumbers + xlTextValues)
            On Error GoTo 0

            If Not tmp Is Nothing Then
                For Each MyRNG In tmp
                    .Cells(MyRNG.Row, "B").Cut .Cells(MyRNG.Row, "H")
                Next MyRNG
            End If

            '▼作業3
            If .Cells(.Rows.Count, "F").End(xlUp).Row > 1 Then
                With .Range("F2", .Cells(.Rows.Count, "F").End(xlUp))
                    .Copy
                    .Parent.Range("B2").PasteSpecial Paste:=xlPasteAll, SkipBlanks:=True
                    .Clear
                    Application.CutCopyMode = False
                End With
            End If
        End With

    End Sub

(もこな2) 2019/02/08(金) 21:38


↑について。

たぶん、説明してない方法をかなり使っているので、はじめはわけわからん状態だとおもいます。
全部説明するのもしんどいので、一度ステップ実行していただいて、動きや、変数に何が格納されているかを確認していただいてから、どの部分がわからないのかを挙げて聞くと、私じゃなくても皆さん答えてくださると思います。

(もこな2) 2019/02/08(金) 21:49


もこな2さん、隠居じーさんさんありがとうございます。

提案頂いたコードをしっかりとステップ実行で確認して勉強させていただきます。
皆様ありがとうございました。
(なのれい) 2019/02/08(金) 22:00


コメント返信:

[ 一覧(最新更新順) ]


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