Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


7736 / 13645 ツリー ←次へ | 前へ→

【37164】セルの検索 他 ペーロケ 06/4/24(月) 8:35 質問[未読]
【37165】Re:セルの検索 他 ハチ 06/4/24(月) 9:22 回答[未読]
【37172】追加質問 ペーロケ 06/4/25(火) 8:25 お礼[未読]
【37173】Re:追加質問 ハチ 06/4/25(火) 9:10 回答[未読]
【37185】Re:追加質問 ペーロケ 06/4/25(火) 11:56 お礼[未読]
【37166】Re:セルの検索 他 Statis 06/4/24(月) 9:23 回答[未読]
【37168】Re:セルの検索 他 ichinose 06/4/24(月) 23:07 発言[未読]
【37170】Re:セルの検索 他 Kein 06/4/25(火) 1:41 回答[未読]
【37171】Re:セルの検索 他 ichinose 06/4/25(火) 7:25 発言[未読]

【37164】セルの検索 他
質問  ペーロケ  - 06/4/24(月) 8:35 -

引用なし
パスワード
   最近、ここのサイトをよく利用し勉強させて頂いてます。
質問は以下のとおりです。

   a   b   c
1   5  
2   2  10  20
3   2  30  40
4   5  50  60
5   5  70  80
6   8  90  100
7   9  110  120

というような並びのデータがあるとします(a2からは昇順)。
そこで、range("a1")と等しい(この場合5)セルをa列から検索して
そこに該当する行を他の行へコピーするという作業を行ってみたいところです。

感じとしては、Do・・・loopでa列を探して、
この場合は4行目でloopを抜けて
そこから2行分をコピーするように記述するのかな・・と
考えているんですが、ちょっと分かりませんでした。。

VBAはまだまだ初心者ですが、
ご教授願いたいと思います。

よろしくお願いします。

【37165】Re:セルの検索 他
回答  ハチ  - 06/4/24(月) 9:22 -

引用なし
パスワード
   Worksheets(1)にデータがあって、(2)にコピーするのなら
こんな感じでしょうか?

Sub Test()

Dim i, i2 As Integer
i = 2: i2 = 1

With Worksheets(1)
Do While .Cells(i, 1).Value <= .Cells(1, 1).Value

  If .Cells(i, 1).Value = .Cells(1, 1).Value Then
    .Rows(i).Copy Destination:=Worksheets(2).Rows(i2)
    i2 = i2 + 1
  End If
i = i + 1
Loop

End With

End Sub

【37166】Re:セルの検索 他
回答  Statis  - 06/4/24(月) 9:23 -

引用なし
パスワード
   こんにちは

数式を使っています。(IV列を作業列として使用)

Sub Test()
Dim R As Range
With Range("A2", Range("A65536").End(xlUp)).Offset(, 255)
   .Formula = "=IF(A2=$A$1,1,"""")"
   .Value = .Value
   On Error Resume Next
   Set R = .SpecialCells(xlCellTypeConstants)
   On Error GoTo 0
   .ClearContents
   R.EntireRow.Copy Worksheets("Sheet2").Range("A1")
End With
Set R = Nothing
End Sub

【37168】Re:セルの検索 他
発言  ichinose  - 06/4/24(月) 23:07 -

引用なし
パスワード
   ▼Statis さん:
こんばんは。


投稿テストも兼ねて・・・。


Specialcellsメソッドで

  セルA2だけが調査対象セルだった場合と
  該当するセルが一つもなかったときの処理を入れると

>Sub Test()
>Dim R As Range
>With Range("A2", Range("A65536").End(xlUp)).Offset(, 255)
  .Formula = "=IF(A2=$A$1,1,"""")"
  On Error Resume Next
  Set R = .Offset(-1, 0).Resize(.Count + 1, 1).SpecialCells(xlCellTypeFormulas, xlNumbers)
  If Err.Number = 0 Then
    R.EntireRow.Copy Worksheets("Sheet2").Range("A1")
    End If
  .ClearContents
>End With
>Set R = Nothing
>End Sub

としてみてはいかがですか?

【37170】Re:セルの検索 他
回答  Kein  - 06/4/25(火) 1:41 -

引用なし
パスワード
   EntireRow をコピーしちゃうと、コピー先シートのIV列にも数式が入ってしまいます。
なので私なら

Sub Test3()
  Dim MyR As Range

  With Range("A2", Range("A65536").End(xlUp)).Offset(, 255)
   .Formula = "=IF($A2=$A$1,1,"""")"
   On Error Resume Next
   Set MyR = .SpecialCells(3, 1)
   .ClearContents
  End With
  If Err.Number = 0 Then
   Intersect(MyR.EntireRow, Range("A:IU")).Copy _
    Worksheets("Sheet2").Range("A1")
  Else
   MsgBox "A1 の値と一致するセルはありません", 48
  End If
  Set MyR = Nothing
End Sub

【37171】Re:セルの検索 他
発言  ichinose  - 06/4/25(火) 7:25 -

引用なし
パスワード
   おはようございます。
Keinさん
>EntireRow をコピーしちゃうと、コピー先シートのIV列にも数式が入ってしまいます。

あッ、本当ですね!! ありがとうございます。

では、

.ClearContentsの実行する箇所を変更して

>
>>Sub Test()
>>Dim R As Range
>>With Range("A2", Range("A65536").End(xlUp)).Offset(, 255)
>  .Formula = "=IF(A2=$A$1,1,"""")"
>  On Error Resume Next
>  Set R = .Offset(-1, 0).Resize(.Count + 1, 1).SpecialCells(xlCellTypeFormulas, xlNumbers)
   .ClearContents
>  If Err.Number = 0 Then
>    R.EntireRow.Copy Worksheets("Sheet2").Range("A1")
>    End If
  
>>End With
>>Set R = Nothing
>>End Sub

【37172】追加質問
お礼  ペーロケ  - 06/4/25(火) 8:25 -

引用なし
パスワード
   お礼遅くなりました!(書込みできるようになりましたので・・・)
みなさんありがとうございます。

色々と参考にしながら、
みなさんのを参考にしながら、

Sub Test()

Dim LstRow As Long
Dim i, i2 As Integer
LstRow = 105
With Worksheets(1)
  For i = 2 To LastRow
    If .Cells(i, 1) = .Cells(1, 1) Then
      .Rows(i).Copy Destination:=Worksheets(2).Rows(i2)
      i2 = i2 + 1
    End If
  Next i
End With
End Sub

というような感じで、まずは試してみました。

そこで、さらなる質問ですが、

   a   b   c
1   5  50
2   4  10  20
3   4  30  40
4   5  50  60
5   5  50  80
6   3  90  100
7   6  110  120

同じような並びで、
今度は、A1かつB1セルと等しいものを
A列、B列から探すという、条件を増やした時は
どういう感じにすればよいのでしょうか?
加えて、A列の並びは一かたまりになってはいますが
並びは不規則の場合です・・・

お願いします!

【37173】Re:追加質問
回答  ハチ  - 06/4/25(火) 9:10 -

引用なし
パスワード
   ▼ペーロケ さん:
>お礼遅くなりました!(書込みできるようになりましたので・・・)
>みなさんありがとうございます。
>
>色々と参考にしながら、
>みなさんのを参考にしながら、
>
>Sub Test()
>
>Dim LstRow As Long
>Dim i, i2 As Integer
>LstRow = 105
>With Worksheets(1)
>  For i = 2 To LastRow
>    If .Cells(i, 1) = .Cells(1, 1) Then
>      .Rows(i).Copy Destination:=Worksheets(2).Rows(i2)
>      i2 = i2 + 1
>    End If
>  Next i
>End With
>End Sub
>
>というような感じで、まずは試してみました。
>
>そこで、さらなる質問ですが、
>
>   a   b   c
>1   5  50
>2   4  10  20
>3   4  30  40
>4   5  50  60
>5   5  50  80
>6   3  90  100
>7   6  110  120
>
>同じような並びで、
>今度は、A1かつB1セルと等しいものを
>A列、B列から探すという、条件を増やした時は
>どういう感じにすればよいのでしょうか?
>加えて、A列の並びは一かたまりになってはいますが
>並びは不規則の場合です・・・
>
>お願いします!

おはようございます。

1行づつ処理する方法でヤるんですね。
If .Cells(i, 1) = .Cells(1, 1) Then
の部分を
If .Cells(i, 1) = .Cells(1, 1) And _
.Cells(i, 2) = .Cells(1, 2) Then

にすれば良いと思います。
他の方が書いてくれているマクロのほうが、
高速に処理できますので勉強してどうでしょうか?

【37185】Re:追加質問
お礼  ペーロケ  - 06/4/25(火) 11:56 -

引用なし
パスワード
   ハチさん、早速のレスありがとうございます。


>If .Cells(i, 1) = .Cells(1, 1) And _
>.Cells(i, 2) = .Cells(1, 2) Then

なるほど。
エクセルのIF関数だと分かるんですが、
VBAの記述が分かりませんでした・・・
早速やってみます!


>他の方が書いてくれているマクロのほうが、
>高速に処理できますので勉強してどうでしょうか?

ハチさんはじめ、他の方のマクロ試してみました。
ん〜、確かにデータ数を増やすと処理が速いですね(汗
VBAは初級レベルなので
みなさんの参考にして自分なりのソースが
書けるよう頑張ってみます!

一先ずはありがとうございました!

7736 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free