|
▼ニャンソ さん:
>▼kanabun さん:
>
>明けましておめでとうございます。
スラマッ ターフン・バルー(インドネシア語で
新年おめでとうございます m(_ _)m)
>>まず、Sub Try1b() が想定しているような BookとSheetのレイアウトで
>>実行検証できる最低限のサンプルデータをつくり、そこで、ステップ実行
>>なりしながら、コードの各行がしていることを理解することから始める
>>のが、「急がば回れ」かと思います。
>
>分かりました。
>少しずつ頑張ります。
>
>
>結果ですが、
>Sub Try1()の
>
>Set shtL = Book3.Worksheets("List")
>
>と
>
>With Book3.Worksheets("Temp") 'Temp Sheetに必要データだけ転記
>
>のところが、インデックスがないと出てしまいます。
>
>名前をコピペしたので間違いがないはずなのですが…
インデックスがない、とは そういう名前のシートがない、という意味だと
思います。マクロを書いたBookに 「List」という名前のシート、「Temp」
という名前のシートが必要です。
それぞれのシート・レイアウトは以下のようなのを想定しています。
Book3 「List」シート
A B C D E G
グループ 従業員
県名 地区 番号 番号 従業員名 地区
愛知 A地区 1 005 新井 A地区
岐阜 B地区 1 006 荒川 B地区
三重 C地区 2 015 上野 C地区
静岡 D地区 2 017 遠藤
福井 E地区 3 020 大貫
東京 A地区 6 038 君島
東京 B地区 6 041 小池
東京 C地区 6 050 佐々木
東京 D地区 6 051 佐藤
東京 E地区 6 057 鈴木
東京 F地区 6 058 須藤
東京 G地区 6 062 高久
東京 X地区 6 065 高橋
Book3 「Temp」シート Try1() 実行後
A B C D E G H
従業員 従業員 申請 実
Group番号 県名 地区 番号 氏名 金額 金額
1 三重 C地区 005 新井 87 73
2 岐阜 B地区 015 上野 81 73
2 岐阜 B地区 017 遠藤 90 51
3 三重 C地区 020 大貫 87 36
3 愛知 A地区 024 岡田 63 100
4 愛知 A地区 030 加藤 73 44
4 三重 C地区 032 神山 91 32
5 愛知 A地区 034 川島 73 44
>
>cc.Resize(, 24).AdvancedFilter xlFilterCopy, _
> CriteriaRange:=c, _
> CopyToRange:=.Cells(nRow, 2).Resize(, 6) '別シートに抽出
>
>またこちらでは、
>
>「抽出した範囲にはフィールド名がないかまたは、無効なフィールド名です」
>と表示されました。
変数 cc というのは、送られてきた Book1 の抽出範囲の[C7]からデータ最終行
までの範囲です。
cc.Resize(, 24) というのは このC列範囲を列方向に24列分拡張した表範囲
のことです。
これは
>Book1 Sheet1
>A・B・C・D・E・F・G・H 〜 X・Y・Z
>空白・通番・県名・地区・グループ番号・従業員番号・従業員名・過去申請金額・>申請金額・実金額
というレイアウトを仮定しています。
これも7行目に 上記のような項目名が(文字列は違っていてもかまいませんが、
列の役割が違っていては困ります。)書いてあり、Book1 から必要な地区名だけ
(←これは Book3の「List」シートのG列に書いてあります)Book3の「Temp」
シートに抽出コピーしようとしています。
> With Book3.Worksheets("Temp") 'Temp Sheetに必要データだけ転記
> .UsedRange.Clear
> '列見出しのコピー
> .Cells(nRow, 1) = "Group番号" 'あとで Book3より引用
> .Cells(nRow, 2) = shtA.[C7].Value '県名
> .Cells(nRow, 3) = shtA.[D7].Value '地区★
> .Cells(nRow, 4) = shtA.[F7].Value '従業員番号-----+
> .Cells(nRow, 5) = shtA.[G7].Value '従業員氏名 |印刷項目
> .Cells(nRow, 6) = shtA.[Y7].Value '申請金額 |
> .Cells(nRow, 7) = shtA.[Z7].Value '実金額 -------+
> With shtA
> Set cc = .Range("C7", .Cells(.Rows.Count, "C").End(xlUp))
> End With
> cc.Resize(, 24).AdvancedFilter xlFilterCopy, _
> CriteriaRange:=c, _
> CopyToRange:=.Cells(nRow, 2).Resize(, 6) '別シートに抽出
Book3の「Temp」シートは白紙の状態のされ( .UsedRange.Clear )
そこに必要な項目をBook1の7行目から転記し、
AdvancedFilter(フィルタオプションの設定)で 必要な地区名データだけを
いま「Temp」シートに転記した項目名の列だけ Book3「Temp」に抽出して
います。
AdvancedFilterでは 項目名が重要です。そして、項目名の順番は抽出先
シートで 元シートの順番と違っていても問題ありません。
●Book3「Temp」の抽出データの列並び順は 印刷時の並び順に合わせておき
ます。
もちろん、グループ番号で行方向に並び替えてから、グループ番号順に印刷
しますから、印刷に必要な項目以外に それら並び替えなど表の加工に必要
なデータも書き出しておき、
> ◆A:Group番号 D:従業員NB E:員名 F:申請日 G:申請金額 H:実金額
印刷範囲は このうちの cc.Columns("D:H") だけにしているわけです。
>
>今さらで申し訳ないのですが、「Workbook」・「 Worksheet」・「Sheets」・「Worksheets」の
>違いは何ですか?
「Workbook」はブック、他は シートです。
「Sheets」は Worksheet と Chart があります(ワークシートと グラフシート
の両方が含まれます)
「Worksheets」は 「Worksheet」(ワークシート)の集合(Collection)のこと
です。セルの集合(Collection)が Cells, Workbookの集合が Workbooks
ワークシートの集合が Worksheets です。
集合内の個々のメンバーのことをItemプロパティで指定します。
Worksheets.Item("Sheet1") といったら、
Worksheets Collection(集合) 内の 「Sheet1」という名前のシートのことです。
通常Worksheets.Item("Sheet1") は Worksheets("Sheet1") と省略して書きます。
Cells(1,1) というのも Cells(つまり ワークシートのなかのすべてのセルの集合
) の中の .Item(1, 1) 1行1列目にある単一セル[A1]のことを .Item を省略して
Cells(1,1) と書いているんです。
Book3 のすべてのワークシートの集合 Worksheets のなかに メンバー"List" や
メンバー"Temp" がいないと、「インデックスが有効範囲にありません」という
エラーが出ます。
Worksheets.Item("List") でエラーなら、そういうItem がないということです。
|
|