Excel VBA質問箱 IV

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

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


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

【19136】データの複写 kuyacchi 04/10/22(金) 23:36 質問[未読]
【19137】Re:データの複写 チーコ 04/10/22(金) 23:58 回答[未読]
【19138】Re:データの複写 kuyacchi 04/10/23(土) 0:23 質問[未読]
【19139】Re:データの複写 kuyacchi 04/10/23(土) 0:26 質問[未読]
【19141】Re:データの複写 チーコ 04/10/23(土) 0:45 回答[未読]
【19144】Re:データの複写 kuyacchi 04/10/23(土) 10:19 質問[未読]
【19147】Re:データの複写 チーコ 04/10/23(土) 11:37 回答[未読]
【19146】Re:データの複写 かみちゃん 04/10/23(土) 11:33 回答[未読]
【19149】Re:データの複写 kuyacchi 04/10/23(土) 12:09 お礼[未読]
【19150】Re:データの複写 かみちゃん 04/10/23(土) 13:37 発言[未読]
【19151】Re:データの複写 kuyacchi 04/10/23(土) 14:08 お礼[未読]
【19152】Re:データの複写 かみちゃん 04/10/23(土) 15:41 回答[未読]
【19154】Re:データの複写 kuyacchi 04/10/23(土) 20:29 お礼[未読]

【19136】データの複写
質問  kuyacchi  - 04/10/22(金) 23:36 -

引用なし
パスワード
   エクセルのVBAで今詰まっています。
シート1に次のようなデータがあったとします。

  A     B     C
13 False  CD-ROM    2
14 True   PC      1
15 True   DVD-RAM   3
16 False  MO      4
17 True   ケーブル   2

ここで
Range("A13").AutoFilter 1, True
でオートフィルターをかけて、B13:C17のデータ(実際は14、15、17)を
別のシート(シート2)のC6:D6の下の行にかけて“値”の貼り付けさせたいのですが、
うまくいきません。


どのようなコードにすれば良いでしょうか?
また、“C6:D6の下の行にかけて”の意味は、シート1で抽出する行が可変の為
すべての範囲を指定できないからです。
上記のサンプルでは

  C      D
6 PC      1
7 DVD-RAM   3
8 ケーブル   2

としたいのです。宜しくお願いします。

【19137】Re:データの複写
回答  チーコ  - 04/10/22(金) 23:58 -

引用なし
パスワード
   ▼kuyacchi さん:
>エクセルのVBAで今詰まっています。
>シート1に次のようなデータがあったとします。
>
>  A     B     C
>13 False  CD-ROM    2
>14 True   PC      1
>15 True   DVD-RAM   3
>16 False  MO      4
>17 True   ケーブル   2
>
>ここで
>Range("A13").AutoFilter 1, True
>でオートフィルターをかけて、B13:C17のデータ(実際は14、15、17)を
>別のシート(シート2)のC6:D6の下の行にかけて“値”の貼り付けさせたいのですが、
>うまくいきません。
>
>
>どのようなコードにすれば良いでしょうか?
>また、“C6:D6の下の行にかけて”の意味は、シート1で抽出する行が可変の為
>すべての範囲を指定できないからです。
>上記のサンプルでは
>
>  C      D
>6 PC      1
>7 DVD-RAM   3
>8 ケーブル   2
>
>としたいのです。宜しくお願いします。


最終行を見つけてコピーするということでしょうか?
シートの行数は sheet1.cells(sheet1.rows.count,対象列).End(xlup).Row
で求めることができます。

【19138】Re:データの複写
質問  kuyacchi  - 04/10/23(土) 0:23 -

引用なし
パスワード
   チーコさん早々と有難うございます。
いえ、最終行及び列は分かっています。

シート1の方は実際には
F13:H37
シート2の方は
C6:E30
です。

つまり、例えば抽出した結果が5行だった場合、C6:E30と、25行貼り付けるという命令はどうかと思いまして・・・。
そこで抽出するのは、F13:H37
貼り付けるほうは、C6:E6
と思ったのですが、違うのですか?

Range("A12").AutoFilter 1, True
Worksheets("Sheet1").Range("F13:H37").Copy
Worksheets("Sheet2").Activate
Worksheets("内訳").Range("C6:E6").Select.Paste ←ここら辺の構文がよく分からないのです。
また式や書式は張り付かないように、値だけを貼り付けたいのです。

【19139】Re:データの複写
質問  kuyacchi  - 04/10/23(土) 0:26 -

引用なし
パスワード
   すいません。
修正していないまま送ってしまいました。
下記の間違いです。


Range("A12").AutoFilter 1, True
Worksheets("Sheet1").Range("F13:H37").Copy
Worksheets("Sheet2").Activate
Worksheets("Sheet2").Range("C6:E6").Select.Paste ←ここら辺の構文がよく分からないのです。
また式や書式は張り付かないように、値だけを貼り付けたいのです。

【19141】Re:データの複写
回答  チーコ  - 04/10/23(土) 0:45 -

引用なし
パスワード
   ▼kuyacchi さん:
>すいません。
>修正していないまま送ってしまいました。
>下記の間違いです。
>
>
>Range("A12").AutoFilter 1, True
>Worksheets("Sheet1").Range("F13:H37").Copy
>Worksheets("Sheet2").Activate
>Worksheets("Sheet2").Range("C6:E6").Select.Paste ←ここら辺の構文がよく分からないのです。
>また式や書式は張り付かないように、値だけを貼り付けたいのです。

はい解りました。
特定のセルが決まっていない場合はrangeではなく
cellを使われたほうがいいのでは?

Sheet1.Range(Sheet1.Cells(6 13),Sheet1.Cells(37 8)).Copy
Sheet2.Cells(6,3).PasteSpecial Paste:=xlPasteValues

値だけならojct.PasteSpecial Paste:=xlPasteValuesで
貼り付けできます。

【19144】Re:データの複写
質問  kuyacchi  - 04/10/23(土) 10:19 -

引用なし
パスワード
   >Sheet1.Range(Sheet1.Cells(6 13),Sheet1.Cells(37 8)).Copy
>Sheet2.Cells(6,3).PasteSpecial Paste:=xlPasteValues
>
>値だけならojct.PasteSpecial Paste:=xlPasteValuesで
>貼り付けできます。

一応、やってみたのですが、どうもうまくいきません。
ojct.PasteSpecial Paste:=xlPasteValues
ではうまく張り付かないのです。
Sheet1.Range(Sheet1.Cells(6 13),Sheet1.Cells(37 8)).Copy

Sheet1.Range(Sheet1.Cells(6, 13),Sheet1.Cells(8, 37)).Copy
でよいのですか?

【19146】Re:データの複写
回答  かみちゃん  - 04/10/23(土) 11:33 -

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

横から失礼します。

>でオートフィルターをかけて、B13:C17のデータ(実際は14、15、17)を
>別のシート(シート2)のC6:D6の下の行にかけて“値”の貼り付けさせたいのですが、

「シート1で抽出する行が可変」ということで混乱しましたが、要は、抽出行数は可変だけど、貼り付け先の左上端のセル(C6)で固定ということですよね?
つまり、貼り付け先の最終行は取得しなていいのではないでしょうか?

ポイントは、オートフィルタで抽出した行は、可視セルのみのコピーをするということです。
ただし、実際に操作してみるとわかるのですが、先頭行は、項目名として処理されると思いますので、項目名を先頭行につけてください。

スレッドの内容を一通り読ませていただき、実際のセル範囲で書き換えてみると、
以下のコードでできました。

Sub Macro1()
  Dim FilterSheetName As String
  Dim PasteSheetName As String
  
  '元のシート(AutoFilterで抽出するシート)
  FilterSheetName = ActiveSheet.Name
  '貼り付けシート名
  PasteSheetName = "Sheet2_1"
  
  Sheets(FilterSheetName).Select
  '先頭行を項目名行として、指定したセル範囲AutoFilterする。
  Range("F12:H37").AutoFilter 1, True
  '抽出された行の可視セルのみCopyする。(先頭行はタイトルなので含めない)
  With ActiveSheet.AutoFilter.Range
   .Resize(.Rows.Count - 1).Offset(1).SpecialCells(xlCellTypeVisible).Copy
  End With
  
  Sheets(PasteSheetName).Select
  '貼付先の左上端のセルを指定する
  Range("C6").Select
  '値のみ複写
  Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
  
  '元のシートに戻ってAutoFilterの解除
  Sheets(FilterSheetName).Select
  Range("F12:H37").AutoFilter
  Application.CutCopyMode = False
  MsgBox "抽出貼付処理ができました。"
End Sub

【19147】Re:データの複写
回答  チーコ  - 04/10/23(土) 11:37 -

引用なし
パスワード
   ▼kuyacchi さん:
>>Sheet1.Range(Sheet1.Cells(6 13),Sheet1.Cells(37 8)).Copy
>>Sheet2.Cells(6,3).PasteSpecial Paste:=xlPasteValues
>>
>>値だけならojct.PasteSpecial Paste:=xlPasteValuesで
>>貼り付けできます。
>
>一応、やってみたのですが、どうもうまくいきません。
>ojct.PasteSpecial Paste:=xlPasteValues
>ではうまく張り付かないのです。
>Sheet1.Range(Sheet1.Cells(6 13),Sheet1.Cells(37 8)).Copy
>は
>Sheet1.Range(Sheet1.Cells(6, 13),Sheet1.Cells(8, 37)).Copy
>でよいのですか?

すいません。
上記の例でカンマが抜けている部分がありました。
sheet1はworkseetのオブジェクト名です。
オブジェクト.cells(行番号,列番号)が書式です。
cells(6,13)は"M6"
cells(8,37)は"AK8"です。
ですからsheet1.range("M6":"AK8").copyと書いているのと同じことです。

うまくいかないのはコピーペーストが上手くいかないのですか?
エラーがでてうまくいかないのですか?

【19149】Re:データの複写
お礼  kuyacchi  - 04/10/23(土) 12:09 -

引用なし
パスワード
   チーコさん、かみちゃんさん有難うございました。
いろいろと有難うございました。
一応自分なりにやってみて、
Range("A11").AutoFilter 1, True
Worksheets("Sheet1").Range("F13:H37").Copy
Worksheets("Sheet2").Activate
Worksheets("Sheet2").Range("C8:E8").PasteSpecial (xlPasteValues)
でうまくいきました。
実際には転送ボタンが付いていて、それをクリックすると行われるのですが・・・。

上記の構文で、“これはいらない”とか“この構文で覚えないほうがいい”とかありましたらご指導ください。

まだまだ、やりたいことがあります。
今のところ構想段階なのですが、
例えば、Sheet2を非表示(フォーマット)として、ボタンをクリックすると、
Sheet2をコピーして、新しいシートが生成されてデータが張り付けられるとかを考えています。
また、質問させていただきます。
宜しくお願いします。

【19150】Re:データの複写
発言  かみちゃん  - 04/10/23(土) 13:37 -

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

>一応自分なりにやってみて、
>Range("A11").AutoFilter 1, True
>Worksheets("Sheet1").Range("F13:H37").Copy

解決されたということですが、ひとつ確認していただきたいことがあります。
上記のコードでは、たしかに抽出されたデータのみコピーされているでしょうけど、実際には、25行コピーされていませんか?
たとえば、抽出された行数が5行だった場合、貼付先には、データが5行に続けて、20行分空白が貼り付いていませんか?

>例えば、Sheet2を非表示(フォーマット)として、ボタンをクリックすると、
>Sheet2をコピーして、新しいシートが生成されてデータが張り付けられるとかを考えています。

もちろんできます。
がんばってください。

【19151】Re:データの複写
お礼  kuyacchi  - 04/10/23(土) 14:08 -

引用なし
パスワード
   有難うございます。

Sheet2を確認したところ、貼り付けた場所が反転したままになっているのですが、
その部分は貼り付けた行のみでした。

ひとつ気になることがありまして、コピーした後、Sheet1で、
選択した範囲が、点線で囲まれたままになっています。
これを消すにはどのようにすれば良いのでしょうか?

【19152】Re:データの複写
回答  かみちゃん  - 04/10/23(土) 15:41 -

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

>Sheet2を確認したところ、貼り付けた場所が反転したままになっているのですが、
>その部分は貼り付けた行のみでした。

そうですか。
こちらで、確認したところ、「貼り付けた行」ではなく、Copy時に範囲指定した25行分が反転したままになっていましたので、確認していただこうと思い、書き込みしました。
今、現在どういうコードになっているかは、わかりませんので、これ以上は、言わないでおこうと思います。いらぬ混乱を招きそうなので。

>ひとつ気になることがありまして、コピーした後、Sheet1で、
>選択した範囲が、点線で囲まれたままになっています。
>これを消すにはどのようにすれば良いのでしょうか?

私が提示したコードでは、きちんと消しています。
ズバリ、点線を消すための1行があります。どの行かは、確認してみてください。

【19154】Re:データの複写
お礼  kuyacchi  - 04/10/23(土) 20:29 -

引用なし
パスワード
   こんばんは、かみちゃんさん。

>そうですか。
>こちらで、確認したところ、「貼り付けた行」ではなく、Copy時に範囲指定した25行分
>が反転したままになっていましたので、確認していただこうと思い、書き込みしまし
>た。
>今、現在どういうコードになっているかは、わかりませんので、これ以上は、言わない
>でおこうと思います。いらぬ混乱を招きそうなので。

いくつか複写する部分が増えていますが、今のコードは以下の通りです。
入力というのがSheet1
内訳というのがSheet2
です。

Private Sub 転送_Click()
Range("A10").AutoFilter 1, True
  Worksheets("入力").Range("B13:C37").Copy
  Worksheets("内訳").Range("A8:B8").PasteSpecial (xlPasteValues)
  
  Worksheets("入力").Range("F13:H37").Copy
  Worksheets("内訳").Range("C8:E8").PasteSpecial (xlPasteValues)

  Worksheets("入力").Range("S13:T37").Copy
  Worksheets("内訳").Range("F8:G8").PasteSpecial (xlPasteValues)
Worksheets("入力").Activate
ActiveSheet.AutoFilterMode = False
Application.CutCopyMode = False
End Sub

>私が提示したコードでは、きちんと消しています。
>ズバリ、点線を消すための1行があります。どの行かは、確認してみてください。

すぐわかりました。
Application.CutCopyMode = False
ですね。
ありがとうございました。

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