みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

マクロ 抽出してコピー貼り付けしたい

 以下のような、サイトでコードをみつけました。今ひとつ、分からないことがあります。お教え下さいませんか。

やりたい元のデーターと抽出先について
sheet1の元データーはA列~G列のデーターです。sheet1のA列・B列・D列・E列・G列だけを抽出して、sheet2に表示させたいのです。なお、sheet1には、関数が入っています。


以下はサイトからのものです。
実行結果(1列目と3列目を抽出)
Sub 列抽出()
Dim データ範囲 As Range
Dim 抽出列 As Variant
Dim i As Long
Set データ範囲 = ActiveSheet.Range("A1").CurrentRegion
 抽出列 = Array(1, 3)
 Sheets.Add.Name = "抽出"
For i = 0 To UBound(抽出列)
 データ範囲.Columns(抽出列(i)).Copy Sheets("抽出").Range("A1").Offset(0, i)
Next i
End Sub

投稿日時 - 2019-02-02 11:06:15

QNo.9583804

困ってます

質問者が選んだベストアンサー

>なお、sheet1には、関数が入っています。
見落としていました。
Sub 列抽出3()
 Dim データ範囲 As Range
 Dim 抽出列 As Variant
 Dim i As Long
 Set データ範囲 = Sheets("Sheet1").Range("A1").CurrentRegion
 抽出列 = Array(1, 2, 4, 5, 7)
 For i = 0 To UBound(抽出列)
  データ範囲.Columns(抽出列(i)).Copy
  Sheets("Sheet2").Range("A1").Offset(0, i).PasteSpecial Paste:=xlPasteValues
 Next i
End Sub

投稿日時 - 2019-02-02 11:33:54

お礼

色んな方にご迷惑おかけしています。初心者とはいえもっと質問内容を勉強してするべきですね。いつも感じているのですが、申し訳ありません。まだまだだと思いますが、今後ともよろしくお願いします。有難うございました。

投稿日時 - 2019-02-03 09:45:11

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

モノは考えよう。プログラムにはいろいろなアプローチが可能です。
まるごと数式関数の入ったシートを新しいしーとへコピペして、いらぬ列を丸ごと列ごと消せば同じ結果にたどり着きます。
 そしてエクセルにとってずっと簡単で早い動作のプログラムになるでしょう。

投稿日時 - 2019-02-02 13:29:52

お礼

その通りですね。もっと勉強します。できれば、今後ともお教え頂ければと思っております。

投稿日時 - 2019-02-03 09:35:48

ANo.3

自分のしたい事が書かれ自分でコードが理解できるWEB記事をもう一度まず探し直すべきです。きっとあるはずです。
 さもないとすべておんぶにだっこになりそうです。
 
 https://kosapi.com/post-3209/
に解説が書いてあるじゃないですか。
このプログラムのコードに書かれたコマンドリストが読めぬ能力だとすると、関数についてもすべておんぶにだっこになりそうです。ゆうりょうでプログラム開発のために働いていくれるサービスを頼むべきでしょう。
コメントに私なりの解説を入れてみましょう。
A列とB列、D、E、G目を抽出し新しいシートに数式を文字としてコピペします。目的の関数や数式のコピペにはひと工夫変換のコードが必要です。たとえば全体シートを数式から文字に変換したコピペを作ってから、それに対して事例のプログラムを使うような工夫が必要です。

実行結果(A列とB列、D、E、G目を抽出)’あるシート内の左端上端から下端入力最終行までのA列とB列、D、E、G目のデータを抽出という名称の変数データに記憶します。
Sub 列抽出() ’プログラムは列抽出という名前でここから始まります。
Dim データ範囲 As Range ’データ範囲という名称でレンジ範囲をメモリする変数を一つ作ります。
Dim 抽出列 As Variant ’抽出列という名称の整数でも文字でも、実数、レンジでも、行列がたの配列変数でメモリする群を一つ作ります。「Variant型の変数は代入時に代入する値のデータ型がチェックされ、それに合うデータ型が自動的に選択される。」ので、文字列として格納されるかもしれません。ただし数式や関数には使えず認識されません。
Dim i As Long ’このVBで最大桁の整数までメモリ可能な変数をiという名称で一つ作ります。
Set データ範囲 = ActiveSheet.Range("A1").CurrentRegion ’最初に左端の最上部のセルA1から始まる連続したデータの固まりをデータ範囲という名称のレンジにさせます。
 抽出列 = Array(1,2,4,5,7) ’Array(1, 3)を応用して、 抽出列という名称の配列変数へその行のA列とB列、D、E、Gのデータを格納します。但し関数は文字として入るはずです。上手く文字として入らなかったらワンステップ工夫して下さい。

 Sheets.Add.Name = "抽出" ’新しいシートを抽出という名称でエクセルのタブに表示してシートを作成します。
For i = 0 To UBound(抽出列)データ範囲.Columns(抽出列(i)).Copy Sheets("抽出").Range("A1").Offset(0, i) ’
Next i
’ i=0から抽出列という配列の最大値(最下行)の行までに繰り返して、アクティブシート内のi行A列とB列、D、E、Gをさっき作った抽出という名称のシートの左端最上行のセル(A1)から書き写し、順繰りオフセットした右列に書き込みアクティブシートの次の行でまた繰り返す。

’写した後、まだ数式が文字としてしかエクセルには認識されていません。そこで該当する範囲を選択してから「編集」「置換」で検索する文字列「=」置換後の文字列「=」で置換する。このようなコードを作る必要があります。


End Sub

投稿日時 - 2019-02-02 13:09:22

お礼

ご協力ありがとうございました。何かふさわしい本があればお教え下さいませんでしょうか。そのことも勉強の一環なのでしようが、申し訳ありません。

投稿日時 - 2019-02-03 09:39:11

ANo.1

Sub 列抽出2()
 Dim データ範囲 As Range
 Dim 抽出列 As Variant
 Dim i As Long
 Set データ範囲 = Sheets("Sheet1").Range("A1").CurrentRegion
 抽出列 = Array(1, 2, 4, 5, 7)
 For i = 0 To UBound(抽出列)
  データ範囲.Columns(抽出列(i)).Copy Sheets("Sheet2").Range("A1").Offset(0, i)
 Next i
End Sub

投稿日時 - 2019-02-02 11:27:38

お礼

有難うございました。今後ともよろしくお願いします。

投稿日時 - 2019-02-03 09:49:10

あなたにオススメの質問