dポイントプレゼントキャンペーン実施中!

前処理として、別のファイルから同じ名称の値がある時、行の最後(一行目であれば"I3")に"正常"と書き込む処理を施しています。

上記もFor文にて作成したのですが、その後に"正常"と「書き込まれていない」行を全選択し、その都度別Sheetsにコピーしていくコードをご教授願えないでしょうか?

下記にはお恥ずかしいながら現在考えているコードになります。

Dim seijourow As Long
Dim rng As Range
Dim k As long

ThisWorkbook.Sheets("2").Active
ThisWorkbook.Sheets("2").select
ThisWorkbook.Sheets("2").Range("A3").select
ThisWorkbook.Sheets("2").Range(Selection.Selection.End(xlToRight)).Select
iCnt = Selection.Count

For seijourow = 1 To iCnt

If ThisWorkbook.Sheets("2").Cells(2, seijougyou + 9).Value <> "正常" Then
rng = ThisWorkbook.Sheets("2").UsedRange.Rows(seijourow)
ThisWorkbook.Sheets("2").Rows(rng).Copy (ThisWorkbook.Sheets("1").Rows(k))

k = k + 1

Exit For

End If

Next

質問者からの補足コメント

  • Sheet2からSheet1にコピーしたいです。

    正常"と書き込まれる列はI列になります(一件目だとすると"I3")。

    コピー先の開始行はSheet1の2行目からになります。

    例として、I4セルが"異常"だとしますと、Sheet1の"A4"~"I4"までの列をSheet1の"A2"~"I2"にコピーしていきたいです。

    ほかに説明不足な点やわかりにくい部分があれば補足いたします。

      補足日時:2022/07/19 13:13
  • >前処理として、別のファイルから同じ名称の値がある時、行の最後(一行目であれば"I3")に"正常"と>書き込む処理を施しています。

    こちらの前処理の詳細なのですが、

    Sheet2に最初からテーブルがいくつかあり、そのテーブルの特定のセルの値が別ファイル(こちらも複数件)の特定のセルの値と一致した場合に、別ファイルのC列の結果をSheet2のI列に入力してくれるようなループ文は作成いたしました。
    そしてその別ファイルのC列の値("正常"なのか"異常"なのか)をI列に入れていくイメージです。

    その後、Sheet2のI列が"異常"の行をSheet1のA2から下に一行ずつコピーしていければと考えています。

      補足日時:2022/07/19 13:54

A 回答 (4件)

補足を読むと


>その後に"正常"と「書き込まれていない」行を全選択し、その都度別Sheetsにコピーしてい
選択・・の解釈が良く分かりませんでしたが・・・
出力範囲全てに対してI列を検証して<> "正常"以外を対象に範囲をSheets("Sheet1")にコピペするで良かったのかな・・
でしたら、
出力先行が常に2行目からで決め打ちなら変数kの初期値を2として処理ごとに1を加算・・・
Selectionでなく I3セルからI列の値のある最終行までをForすれば良いのでこんな感じですかね

Dim seijourow As Long
Dim k As Long: k = 2 '2行目
With ThisWorkbook.Sheets("Sheet2")
For seijourow = 3 To .Cells(Rows.Count, "I").End(xlUp).Row
If .Cells(seijourow, "I").Value <> "正常" Then
.Range(.Cells(seijourow, "A"), .Cells(seijourow, "I")).Copy Sheets("Sheet1").Cells(k, "A")
k = k + 1
End If
Next
End With
    • good
    • 2
この回答へのお礼

またもや補足と入違ってしまいました。。。

今しがた補足した内容でも不足していれば遠慮なくおっしゃってください。

回答ありがとうございます。

お礼日時:2022/07/19 14:11

>("正常"なのか"異常"なのか


>その後、Sheet2のI列が"異常"の行をSheet1のA2から下に一行ずつコピーしていければと考えています。
不足の情報は無いかと・・・#3のコードは検証されましたか?
#2についてはあらかじめ行を選択する必要があります

追加回答のついでですが・・
>Sheet2のI列に入力してくれるようなループ文は作成いたしました。
この処理の段階でSheet1にも出力すれば良いと思いますよ

まぁ、その後・・とあるので間に手作業などがあるのかもしれませんね。。
    • good
    • 1
この回答へのお礼

#2のやり方で解決できましたのでベストアンサーとさせていただきました。
ありがとうございました。

お礼日時:2022/07/19 15:37

こんにちは


ご質問とコードを拝見して混乱しています。
行と列を混同していませんか?
>行の最後(一行目であれば"I3")に"正常"と書き込む処理を施しています。
と言う事であれば、"正常"を探す範囲は I列になると思われます

従って 一行の場合、For を使う必要はないような気がします
複数行を選択している場合は必要になると思いますが・・

ThisWorkbook.Sheets("2").Range(Selection.Selection.End(xlToRight)).Select タイプミスと思われますが・・
ThisWorkbook.Sheets("2").Range(Selection,Selection.End(xlToRight)).Select
ただ、>行を全選択し、ならば列の数を取得する意味はなさそうですね

探す部分(比較分岐)
(変数seijougyouが何かなのは不問で)
If ThisWorkbook.Sheets("2").Cells(2, seijougyou + 9).Value <> "正常"

If ThisWorkbook.Sheets("2").Cells( seijougyou +2, 9).Value <> "正常"
となるのではないかと思います(複数行選択の場合)

rng = ThisWorkbook.Sheets("2").UsedRange.Rows(seijourow)
については
Dim rng As Range なので set が必要です
また、使用する所

ThisWorkbook.Sheets("2").Rows(rng).Copy については
ThisWorkbook.Sheets("2").rng.Copy で
シート名2の使われている範囲のseijourow行の範囲がコピーされます

例:
シート名2のシートで 複数行選択している状態で
選択範囲のI列に"正常" の入力が無い行(最終列迄の範囲)をコピーして
シート名1のシートの最終行(A列の最後の使われている行)の下の行に
ペーストする と言うようなコード例です。。

Dim seijourow As Long
Dim rng As Range
Dim k As Long
With ThisWorkbook.Sheets("2")
For seijourow = Selection(1).Row To Selection(1).Row + Selection.Rows.Count - 1
If .Cells(seijourow, "I").Value <> "正常" Then
Set rng = .UsedRange.Rows(seijourow)
k = ThisWorkbook.Sheets("1").Cells(Rows.Count, 1).End(xlUp).Offset(1).Row
rng.Copy ThisWorkbook.Sheets("1").Rows(k)
End If
Next
End With
    • good
    • 2
この回答へのお礼

ご指摘ありがとうございます。
ちょうど補足を記入しているときにいただいてしまったので、不足しておりました。

>一行の場合、For を使う必要はないような気がします
>複数行を選択している場合は必要になると思いますが・・

こちらは複数行前提で考えています。

お礼日時:2022/07/19 13:21

これはシートの図が無いとイメージ出来ません(シート2枚ありますよね)


行なのか列なのかも謎です(I3~どこまで?)
コピー先の開始行は何行目ですか?(多分変数「k」の値が何行目~?)
機密情報が流出しない程度に値を変える等して教えて下さい
    • good
    • 1
この回答へのお礼

ご指摘ありがとうございます。
質問内容に追記します。

お礼日時:2022/07/19 13:04

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