エクセル2007 VBA シート内のデータを項目名で検索し、その列を新規シートにコピーする方法についてです。
VBAについては初心者で、グーグルで調べながら作ったのですが、コピー後のペーストが上手く出来ません。どうすれば最後まで処理できるのかを教えて下さい。
それと、全体的に書き方がおかしいところがありましたら指摘・改善方法を教えて下さい。
よろしくお願いします。
Sub 配列並べ替え()
Dim myArray As Variant '1項目名希望順配列格納
Dim strArray As Variant '2検索用1の配列格納
Dim LastCol1 As Long '3最終列数格納
Dim LastCol2 As Long '4新規シートの最終列数格納
Dim DefSheetname As Variant '5初期のシート名取得
Dim i As Long
Dim j As Long
'初期シート名を取得。
DefSheetname = ActiveSheet.Name
'初期シートの最終列数取得。
LastCol1 = Worksheets(DefSheetname).Range("A1").End(xlToRight).Column
'シート名:レポートの新規シート追加。
Worksheets.Add.Name = "レポート"
'初期シートを選択。
Worksheets(DefSheetname).Select
'項目名希望順配列格納。
myArray = Array("得意先C", "取引先名1", "製番", "相手管理NO", "品目C", _
"製品名1", "受注数", "受注残数", "納期", "受注単価", _
"受注金額", "出荷数", "出荷金額", "出荷先名1", "郵便番号", "住所1", "TEL", "FAX")
'配列要素数分繰り返し処理。
For i = LBound(myArray) To UBound(myArray)
'検索用の配列(項目名)格納。
strArray = myArray(i)
'A1:LastCol1範囲で配列(項目名)検索し、番号で返す。
j = WorksheetFunction.Match(strArray, Worksheets(DefSheetname).Range(Cells(1, 1), Cells(1, LastCol1)), 0)
'シート名:レポートに変数jの列数目の値を入力。
Columns(j).Copy
'シート名:レポートの最終列数取得。
LastCol2 = Worksheets("レポート").Range("A1").End(xlToRight).Column
'シート名:レポートを選択。
Worksheets("レポート").Select
Range(Cells(1, 1), Cells(1, "LastCol2")).Past
Next i
End Sub
No.1ベストアンサー
- 回答日時:
現在のコードで取り敢えず動くようにするなら
Sub 配列並べ替え()
Dim myArray As Variant '1項目名希望順配列格納
Dim strArray As Variant '2検索用1の配列格納
Dim LastCol1 As Long '3最終列数格納
Dim LastCol2 As Long '4新規シートの最終列数格納
Dim DefSheetname As Variant '5初期のシート名取得
Dim i As Long
Dim j As Long
Dim k As Long
'初期シート名を取得。
DefSheetname = ActiveSheet.Name
'初期シートの最終列数取得。
LastCol1 = Worksheets(DefSheetname).Range("A1").End(xlToRight).Column
'シート名:レポートの新規シート追加。
Worksheets.Add.Name = "レポート"
'初期シートを選択。
Worksheets(DefSheetname).Select
'項目名希望順配列格納。
myArray = Array("得意先C", "取引先名1", "製番", "相手管理NO", _
"品目C", "製品名1", "受注数", "受注残数", _
"納期", "受注単価", "受注金額", "出荷数", _
"出荷金額", "出荷先名1", "郵便番号", "住所1", _
"TEL", "FAX")
k = 1
'配列要素数分繰り返し処理。
For i = LBound(myArray) To UBound(myArray)
'検索用の配列(項目名)格納。
strArray = myArray(i)
j = 0
With Worksheets(DefSheetname)
On Error Resume Next
'A1:LastCol1範囲で配列(項目名)検索し、番号で返す。
j = WorksheetFunction.Match(strArray, .Range(.Cells(1, 1), .Cells(1, LastCol1)), 0)
On Error GoTo 0
If j > 0 Then
'シート名:レポートに変数jの列数目の値を入力。
.Columns(j).Copy Worksheets("レポート").Cells(k)
k = k + 1
End If
End With
Next i
End Sub
..こんな感じです。見比べてください。
でもちょっと効率悪そうですので
myArrayの項目名が元データに【必ずある】事が保障される場合は[フィルタオプション]が使えます。
Sub test1()
Dim myArray As Variant
Dim r As Range
On Error GoTo extLine
myArray = VBA.Array("得意先C", "取引先名1", "製番", "相手管理NO", _
"品目C", "製品名1", "受注数", "受注残数", _
"納期", "受注単価", "受注金額", "出荷数", _
"出荷金額", "出荷先名1", "郵便番号", "住所1", _
"TEL", "FAX")
Set r = ActiveSheet.UsedRange
With Worksheets.Add
.Name = "レポート"
With .Range("A1").Resize(, UBound(myArray) + 1)
.Value = myArray
r.AdvancedFilter Action:=xlFilterCopy, _
CopyToRange:=.Cells, _
Unique:=False
End With
End With
extLine:
Set r = Nothing
If Err.Number <> 0 Then MsgBox Err.Number & "::" & Err.Description
End Sub
この回答への補足
返信遅くなりすみません。
3種類もサンプルありがとうございました。
>・・・【必ずある】事が保障される場合・・・
配列の項目があるかどうかを判別してから処理するべきですね^^;
一番最初に記入していただいたサンプルを元に、判別処理など一部追記して使える様になりました。
最後に記入していただいたサンプルは、まだ理解できない部分が多いので勉強の参考にします。
ありがとうございました。
この後、VBAで別の質問をするのでよろしければ、また力を貸して下さい。
よろしくお願いします。
No.3
- 回答日時:
おかしいところがいくつかありますのでご指摘させていただきます。
シート名:レポートの新規シート追加してますよね?
Worksheets.Add.Name = "レポート"
なのに・・シート名:レポートの最終列数取得してますよね?
下記コードは一番右の列を見に行っている為、新規時点で256行となるはず。
LastCol2 = Worksheets("レポート").Range("A1").End(xlToRight).Column
↓
LastCol2 = Worksheets("レポート").cells(1,256).End(xlToLeft).Column
またコピー、貼り付けのコードもおかしいです。
コピーのときは一行をコピーしてますが、貼り付け時は範囲指定がおかしい・・
あと、『LastCol2』は変数なのに””でくくってしまったら文字列として判断してしまいますよ。
シート名:レポートに変数jの列数目の値を入力。
Columns(j).Copy
Range(Cells(1, 1), Cells(1, "LastCol2")).Past
↓
Columns(LastCol2).paste
この回答への補足
返信遅くなりすみません。
ご指摘ありがとうございました。
あやふやなところが多い為、参考になりました。
また質問をするつもりなので、よろしければまた力を貸して下さい。
よろしくお願いします。
No.2
- 回答日時:
もしくは、丸ごとコピーして順番をセットし、列単位で並べ替えたあとに不要な列を削除したほうが良さそうです。
Sub test2()
Dim myArray As Variant
Dim r As Range
Dim tmp As Range
On Error GoTo extLine
myArray = Array("得意先C", "取引先名1", "製番", "相手管理NO", _
"品目C", "製品名1", "受注数", "受注残数", _
"納期", "受注単価", "受注金額", "出荷数", _
"出荷金額", "出荷先名1", "郵便番号", "住所1", _
"TEL", "FAX")
Set r = ActiveSheet.UsedRange
With Worksheets.Add
.Name = "レポート"
r.Copy .Range("A2")
Set r = .Range("A2").CurrentRegion.Rows(1).Offset(-1)
r.Value = Application.Match(r.Offset(1), myArray, 0)
r.CurrentRegion.Sort Key1:=.Range("A1"), _
Order1:=xlAscending, _
Header:=xlNo, _
OrderCustom:=1, _
MatchCase:=False, _
Orientation:=xlLeftToRight, _
SortMethod:=xlStroke
On Error Resume Next
Set tmp = r.SpecialCells(xlCellTypeConstants, xlErrors)
On Error GoTo 0
If Not tmp Is Nothing Then
tmp.EntireColumn.Delete
End If
.Rows(1).Delete
End With
extLine:
Set tmp = Nothing
Set r = Nothing
If Err.Number <> 0 Then MsgBox Err.Number & "::" & Err.Description
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
読み込みで一行おきに配列に格納
-
文字、(ホワイト)スペース、数...
-
VBAでの100万行以上のデータの...
-
array関数で格納した配列の型を...
-
エクセル 条件を指定した標準...
-
Excelのセルの色指定をVBAから...
-
【VBA】ユーザーフォーム リス...
-
[VBA]改行入りのセルの値を配列...
-
Dictionaryを使い4つの条件の一...
-
エクセルで、絶対値の平均を算...
-
Datatableへの代入
-
SUMPRODUCT関数を用いた最小値
-
テキストボックスのvalueとtext...
-
特定の文字を条件に行挿入とそ...
-
DataGrdViewに関連付けたデータ...
-
Excelのプルダウンで2列分の情...
-
i=cells(Rows.Count, 1)とi=cel...
-
スクロールバーの幅
-
Excelで指定した日付から過去の...
-
Excel VBAのリストボックスの値...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelのセルの色指定をVBAから...
-
ExcelのINDEXとMATCH関数でスピ...
-
エクセルで、絶対値の平均を算...
-
[エクセル]連続する指定範囲か...
-
array関数で格納した配列の型を...
-
読み込みで一行おきに配列に格納
-
表にフィルターをかけ、絞った...
-
配列がとびとびである場合の書き方
-
VBA 配列に格納した値の平均の...
-
DataSetから、DataTableを取得...
-
【VBA】ユーザーフォーム リス...
-
iniファイルのキーと値を取得す...
-
.NET - 配列変数を省略可能の引...
-
Split関数でLong配列に格納する...
-
Datatableへの代入
-
Excel オートフィルタのリスト...
-
SUMPRODUCT関数を用いた最小値
-
エクセル 条件を指定した標準...
-
EXCEL VBA 2次元配列に格納さ...
-
[VBA]改行入りのセルの値を配列...
おすすめ情報