Excel VBA質問箱 IV

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

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


6312 / 13646 ツリー ←次へ | 前へ→

【45967】条件つきでセルをコピーしたい さや 07/1/19(金) 20:53 質問[未読]
【45970】Re:条件つきでセルをコピーしたい ichinose 07/1/19(金) 21:30 発言[未読]
【45972】Re:条件つきでセルをコピーしたい さや 07/1/19(金) 23:55 質問[未読]
【45973】Re:条件つきでセルをコピーしたい かみちゃん 07/1/20(土) 0:00 発言[未読]
【45974】Re:条件つきでセルをコピーしたい さや 07/1/20(土) 0:25 お礼[未読]

【45967】条件つきでセルをコピーしたい
質問  さや  - 07/1/19(金) 20:53 -

引用なし
パスワード
   以下のようなVBAを作りたいのです。

まず、A列のセルA1:A60に、1から26までの数値がランダムに入ります。
そして、そのA1:A60をB列のB1: B60にコピーします。
コピーする条件は次の2点です。

条件1. A1:A60には関数(VLOOKUP)が入っていますが、
    B列にコピーする際には、関数をなくし値のみとしたい。

条件2. A列に同じ数値が続けて入力された場合は、
    上部の数値はコピーせず、1番下のセルのみをコピーする。

    例えば、A2に9、A3に9、A4に9、A5に9が入力されている時は、
     B2とB3とB4にはコピーせず、B5にだけ9をコピーする。
     
    以上です。

私がわかるのは、以下の点です。

条件1.はSelection. PasteSpecial Paste:=xlValuesを使う。

条件2.はIf Then End Ifを使う。

よろしくご教授下さい。

【45970】Re:条件つきでセルをコピーしたい
発言  ichinose  - 07/1/19(金) 21:30 -

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

>
>まず、A列のセルA1:A60に、1から26までの数値がランダムに入ります。
>そして、そのA1:A60をB列のB1: B60にコピーします。
>コピーする条件は次の2点です。
>
>条件1. A1:A60には関数(VLOOKUP)が入っていますが、
>    B列にコピーする際には、関数をなくし値のみとしたい。
>
>条件2. A列に同じ数値が続けて入力された場合は、
>    上部の数値はコピーせず、1番下のセルのみをコピーする。
>

条件1は、Valueプロパティを使えば値だけの移行ができます。

条件2は、セルA1〜A60の範囲で
AnとAn+1を比較し、等しくなければ、AnをBnに移行する。
というループ処理を行なうことで実現出来ます。

Sub test()
  Dim idx As Long
  With Range("a1:a60")
    For idx = 1 To .Count - 1
     If .Cells(idx).Value <> .Cells(idx + 1).Value Then
'     セルAnとAn+1を比較し、等しくなければ、AnをBnに移行する。
      .Cells(idx, 2).Value = .Cells(idx).Value
       End If
     Next
    .Cells(.Count, 2).Value = .Cells(.Count).Value
'    ↑最後のセルは無条件で移行する   
    End With
End Sub

検討してみて下さい

【45972】Re:条件つきでセルをコピーしたい
質問  さや  - 07/1/19(金) 23:55 -

引用なし
パスワード
   ichinoseさん、いつも迅速で丁寧なご回答ありがとうございます。
下記のVBAを作りましたが、私の希望する結果はでませんでした。
再度、ご教授下さい。

Sub 条件付のセルのコピー()

Range("b1:b60").value = Range("a1:a60").value

 Dim idx As Long
  With Range("a1:a60")
    For idx = 1 To .Count - 1
     If .Cells(idx).value <> .Cells(idx + 1).value Then
'     セルAnとAn+1を比較し、等しくなければ、AnをBnに移行する。
      .Cells(idx, 2).value = .Cells(idx).value
       End If
     Next
    .Cells(.Count, 2).value = .Cells(.Count).value
'    ↑最後のセルは無条件で移行する
    End With
   
  Range("b1:b60").value = Range("a1:a60").value
   

End Sub

【45973】Re:条件つきでセルをコピーしたい
発言  かみちゃん  - 07/1/20(土) 0:00 -

引用なし
パスワード
   こんにちは。かみちゃん です。

横から失礼します。

>下記のVBAを作りましたが、私の希望する結果はでませんでした。
>
> Range("b1:b60").value = Range("a1:a60").value

この行は不要かと思います。
同様のことは
 .Cells(idx, 2).value = .Cells(idx).value
の行で実現できています。

【45974】Re:条件つきでセルをコピーしたい
お礼  さや  - 07/1/20(土) 0:25 -

引用なし
パスワード
   ▼かみちゃん さん、早速のご回答ありがとうございました。

>この行は不要かと思います。
>同様のことは
> .Cells(idx, 2).value = .Cells(idx).value
>の行で実現できています。

VBAというのは、同じようなことをダブらせるとマズイのですね。
また、勉強になりました。ありがとうございました。

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