Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Home Premium : Excel 2007)
マクロで、あるセルをコピーし、別シートの任意の場所にペーストする方法を教えてくささい。
投稿日時: 18/06/25 23:28:34
投稿者: kkkk

    A   B   C   D
1
2      案件  内容
3   1   海   山
4        
5       案件  内容
6   2   川   湖
7 
 
「案件」と「1」の文があります。その「案件」の下と「1」の右側の「海」をコピーし、ペーストする方法を教えてください。
B3コピーペーストすれば簡単ですが、セルの場所はバラバラなので、「案件」の下と「1」の右側が望ましいです。
流れは下記通りです。
 
@D1の中身をコピー
Aシート2の任意の場所にベースト
BB2の「案件」の下とA3の「1」の右側の「海」をコピー
Cシート2の任意の場所にベースト
DC2の「内容」の下とA3の隣と隣の「山」をコピー
Eシート2の任意の場所にベースト
FB5の「案件」の下とA6の「2」の右側の「川」をコピー
Gシート2の任意の場所にベースト
HC5の「内容」の下とA6の隣と隣の「湖」をコピー
Iシート2の任意の場所にベースト
 ・
 ・
 ・
 
宜しくお願いします。

回答
投稿日時: 18/06/25 23:52:01
投稿者: mattuwan44

>B3コピーペーストすれば簡単ですが、セルの場所はバラバラなので、「案件」の下と「1」の右側が望ましいです。
う〜ん?
D5だったりA3だったりどこにあるか全くわからなくて、
シート上を検索して「案件」を見つけたら、そこからは、そのセルを基準に、
形が決まってくるってことですか?
で、次々「案件」を探していけばいいのでしょうか?
それとも1個見つけたら列は決まって
 
貼付先が全部任意になってますが、
目視で探して貼り付けるのですか?
何らかのルールはないのですか?
 
目視で探さないと、貼付先が解らないなら、作業の自動化は厳しいかも知れません。
 
その辺今一度よく考えて、作るソフトの仕様(動作のイメージ)を説明してください。

投稿日時: 18/06/26 06:51:54
投稿者: kkkk

コメントをありがとうございます。
  
列は決まっていますが、行がバラバラなのです。
案件が出ているセルの下を選んでコピペする、それを案件が出ている限りコピペし続ける…といった具合です。それなら案件のみでも可能ではないかなと思いますが…
  
宜しくお願いします。

回答
投稿日時: 18/06/26 08:16:16
投稿者: mattuwan44

 >列は決まっていますが、行がバラバラなのです。
  
とりあえず、コピー元は簡単ですね、
「A列に値のある行の2列目と3列目」
と表現できると思います。
  
で、どこに貼りつけましょ?
  
指示をしてください。
(とりあえずE3セルとしました)
  
Sub test()
    Intersect(Range("A:A").SpecialCells(xlCellTypeConstants).EntireRow, _
            Range("B:C")).Copy Range("E3")
End Sub
  
でも、ちゃんと指示をしないと、
他人でもエクセルでも期待した結果を返してくれません。

回答
投稿日時: 18/06/26 10:23:18
投稿者: WinArrow
投稿者のウェブサイトに移動

任意の場所
をどのように指定するか?
ということを考えましょう・・・
 
操作する人に「任意の場所へコピーしてください」を言った場合、
何処に複写してもらえるでしょう?
任意の場所・・は、「どこでもよいから」という意味になります。
ですから、それはあなたが望んだ場所になることはないはずです。
任意ではなく、条件を伝えることです。

投稿日時: 18/06/26 10:42:00
投稿者: kkkk

「案件」はB列ですが、行がバラバラです。
例えば今日の分はB10、B25ですが、昨日の分はB9、B26だったりとセルの位置が決まっていません。
B列の「案件」が記載しているセルの一個下のセルの値をコピペ。
D列の「内容」が記載しているセルの一個下のセルの値をコピペ。
と「案件」と「内容」が記載されていないとこまで続けてコピペします。
 
例(案件と内容の行は同じです。)
6/26日.xlsm(5件)
「日時」G5
「案件」のセル位置はB10、B25、B34、B42、B55
「内容」のセル位置はD10、D25、D34、D42、D55
上記をコピー
 
6.25日.xlsm(7件)
「日時」G5
「案件」のセル位置はB9、B26、B32、B45、B53、B66、B72
「内容」のセル位置はD9、D26、D32、D45、D53、D66、D72
上記をコピー
 
ペースト先はシート2
「日時」A1にペースト
「案件」A2、A3…にペースト
「内容」B2、B3…にペースト

回答
投稿日時: 18/06/26 11:40:10
投稿者: mattuwan44

操作対象のシートが2つになるなら、
どっちのシートの話かも明示しないと伝わりませんよね?
 
 
Sub test()
    dim Rng as range
    with sheets("Sheet1")
        set rng = Intersect(.Range("A:A").SpecialCells(xlCellTypeConstants).EntireRow, .Range("B:C"))
    end with
    rng.copy sheets("Shhet2").range("A2")
    sheets("Shhet2").range("A1").value = sheets("Sheet1").range("G5").value
End Sub
 
とりあえず、こういうことかなと思いますが。。。
いかがでしょう?

投稿日時: 18/06/26 13:14:26
投稿者: kkkk

分かりにくてすみません。
新たに説明します。
 
 Sheet1(コピー元)
    A   B   C
1          6/22
2  案件  内容   
3   海   山
4        
5   案件  内容
6   川   湖
 
 
 Sheet2(ペースト先)
     A   B   
1   6/22 
2   海   山        
3   川   湖
 
 
マクロの流れですが。
 
Sub test()
 Sheet1のC1 セルの値をコピーしてSheet2のA1にペーストせよ。
 Sheet1の「案件」が記載しているセルの下のセルの値をコピーしてSheet2のA2にペーストせよ。
 Sheet1の「内容」が記載しているセルの下のセルの値をコピーしてSheet2のB2にペーストせよ。
 Sheet1の「案件」が記載しているセルの下のセルの値をコピーしてSheet2のA3にペーストせよ。
 Sheet1の「内容」が記載しているセルの下のセルの値をコピーしてSheet2のB3にペーストせよ。
  ・
  ・
  ・
 Sheet1の「案件」と「内容」がもう記載していなければコピーの作業をストップせよ。
End Sub
 
のようになりたいです。

回答
投稿日時: 18/06/26 15:50:18
投稿者: WinArrow
投稿者のウェブサイトに移動

これだけのデータ量だったら
手操作でコピペしたほうが早い・・・
マクロ作っている手間の方が大変です。
 
複写元に
「案件」「内容」という行が複数あるですよね?

引用:
 Sheet1の「案件」が記載しているセルの下のセルの値をコピーしてSheet2のA2にペーストせよ。
  Sheet1の「内容」が記載しているセルの下のセルの値をコピーしてSheet2のB2にペーストせよ。
  Sheet1の「案件」が記載しているセルの下のセルの値をコピーしてSheet2のA3にペーストせよ。
  Sheet1の「内容」が記載しているセルの下のセルの値をコピーしてSheet2のB3にペーストせよ。

この説明では、1件目の「案件」2件目の「案件」なのかわからないでしょう。
 
貼付け場所は、任意ではなく、既に格納されている最終行の一つ下の行と考えれば?
 
 
 
 
 

投稿日時: 18/06/26 15:54:11
投稿者: kkkk

「これだけのデータ量だったら」
説明のため、省略しています。実際は100以上のデータなんです。

回答
投稿日時: 18/06/26 16:17:21
投稿者: WinArrow
投稿者のウェブサイトに移動

kkkk さんの引用:
「これだけのデータ量だったら」
説明のため、省略しています。実際は100以上のデータなんです。

だから・・・・
思ったまま、だらだら書いても、他人には伝わらない
愚痴を言っても解決するわけでもない。
 
コードを記述する前に
物事を整理して、法則を見つけることです。

回答
投稿日時: 18/06/26 17:36:58
投稿者: Suzu

シートをコピーし
 
オートフィルターを設定。
A列では「案件」、B列では「内容」 を条件に抽出し、削除
A列、B列 共 空白 を条件に抽出し、削除
あとは手動で、日付を入れる。
 
例だけを見ると それで事足りそうな。。。

投稿日時: 18/06/26 17:47:23
投稿者: kkkk

Suzu さんの引用:
シートをコピーし
 
オートフィルターを設定。
A列では「案件」、B列では「内容」 を条件に抽出し、削除
A列、B列 共 空白 を条件に抽出し、削除
あとは手動で、日付を入れる。

コメントありがとうございます。
なるほどです。でも、レイアウトが複雑なせいか、うまくいきませんでした。

回答
投稿日時: 18/06/26 18:33:29
投稿者: Suzu

「上手くいかない」だけでは、何が希望と違うのか、回答者には伝わらないのですよ。
ただの丸投げとしか見えないのですが。。。
 
Sub sumple()
    Dim wst1 As Worksheet, wst2 As Worksheet
    Dim Rng As Range
 
    Dim i As Long
    Dim firstAd As String
 
    Set wst1 = Worksheets("Sheet1")
    Set wst2 = Worksheets("Sheet2")
 
    wst1.Range("G5").Copy Destination:=wst2.Range("A1")
 
    Set Rng = wst1.Range("B:B").Find(What:="案件")
    If Not Rng Is Nothing Then firstAd = Rng.Address
 
    i = 1
    Do While Not Rng Is Nothing
        i = i + 1
        If Rng.Offset(0, 2).Value = "内容" Then
            wst2.Cells(i, 1).Value = Rng.Offset(1, 0).Value
            wst2.Cells(i, 2).Value = Rng.Offset(1, 2).Value
        End If
        Set Rng = wst1.Range("B:B").FindNext(After:=Rng)
        If Rng.Address = firstAd Then Exit Do
    Loop
End Sub

回答
投稿日時: 18/06/26 21:20:54
投稿者: simple

商品、内容以外で空白でないものはすべて転記したい、
ということならフィルタオプションも使えるでしょう。
 
「検索条件範囲」で指定したセル範囲の内容を
以下のようにしておけばよいと思います。
 

案件    案件    内容    内容
<>案件  <>      <>内容  <>

 
既にコードが提示されているので用無しかとは思いますが、
この程度ならフィルタオプションでもできますし、
マクロ記録をとれば立派なマクロになります。
自動で他のシートに転記することもやってくれます。
フィルタオプションは応用範囲が広いので、時間がある時に
習熟しておくとよいかもしれません。

回答
投稿日時: 18/06/27 08:14:18
投稿者: mattuwan44

>のようになりたいです。
 
あれ、僕が提示したコードでは意図通りの結果になりませんでしたか?
 
もしかして、繰り返しの処理を自分で書かないといけないと思ってます?
 
ExcelVBAではエクセル君に任せられる部分があるので、
任せられるところは任せちゃうと開発が楽になります。
 
あぁあああああああ!?
 
仕様が変わってます?
 
A列に番号は無しになったのですか?
 
あと、データの塊は、
1行目がタイトル行
2行目がデータ行
 
が、シート上に飛び飛びに配置されていると考えていいのですか?
 
あと、データは並べ替えてもよかったりしますか?
(不要な部分を削除するとか、コピーしないではなく並び替えで除外すると処理が速い場合があるので)
それから、コピーするデータは重複があったりします?
つまり、エクセルの「並び替え」で表内の空白を除去し、
重複するタイトル行を「重複を削除する」で除去できないかな?と考えてます。
 
>でも、レイアウトが複雑なせいか、うまくいきませんでした。
そんなに複雑とは思えません。列は変わらず、
行がちょいちょいずれているけど、
タイトル行とデータが2列2行で一塊ですよね?

投稿日時: 18/06/27 09:23:53
投稿者: kkkk

simple さんの引用:
商品、内容以外で空白でないものはすべて転記したい、
ということならフィルタオプションも使えるでしょう。
 

 
コメントありがとうございます。
 
Suzu様の提案で解決できました。

投稿日時: 18/06/27 09:25:40
投稿者: kkkk

mattuwan44 さんの引用:
>のようになりたいです。
 
あれ、僕が提示したコードでは意図通りの結果になりませんでしたか?
 
もしかして、繰り返しの処理を自分で書かないといけないと思ってます?
 

コメントありがとうございます。
 
Suzu様の提案の「What:="案件”」というものが重要でした。
説明不足ですみません。

投稿日時: 18/06/27 09:27:54
投稿者: kkkk

ありがとうございます。
「What:="案件”」というものが欲しかったのでしたが、なんと言えば良いか、分からず説明不足でした。
おかげさまで解決できました。
感謝します。