|
Jakaさん
返信が遅くなりまして申し訳ありません。
解説ありがとうございました。
>実際、どういった状態で試されているのか解らないし、カスタマイズ及び今作っているプログラムに組み込んで試された結果なのか、それらが解らないので何ともいえないです。
集計ブック
仕入シート
A B C D E ・・・ BE BF
1番号 商品名 単価 数量 合計金額 ・・・ 販売数 残数
2 1 りんご 120 100 12,000 ・・・
3 2 ばなな 100 500 50,000 ・・・
販売シート
A B C D E ・・・
1 番号 商品名 単価 販売数量 金額合計 ・・・
2 3 りんご 120 50 6,000 ・・・
3 4 ばなな 100 100 10,000 ・・・
4 5 りんご 120 20 2,400 ・・・
在庫シート
A B C D ・・・ O P
1 番号 購入番号 販売番号 商品名 ・・・ 初期数量 販売数
2 a 1 3 りんご ・・・ 100 50
3 b 2 4 ばなな ・・・ 500 100
4 c 1 5 りんご ・・・ 100 20
注文表ブック
在庫入力シート
A B
1 番号 c
2 購入番号 1
3 販売番号 5
4 商品名 りんご (VLOOKUPで抽出)
・ ・
・ ・
・ ・
23 初期数量 100 (VLOOKUPで抽出)
24 販売数 20 (VLOOKUPで抽出)
転記ボタン
上記のようになっていて、在庫入力シートのB列を在庫シートに行列を入れ替えて転記しています。
転記後、在庫入力シートの購入番号で在庫シートのオートフィルタかけ、
同じように在庫入力シートの購入番号で仕入シートをオートフィルタかけています。
最終的には在庫シートの販売数を仕入シートのBE列の対応番号に在庫シートのP列の最後の行のセルを張付け、仕入れシートのD-BEの計算をさせて結果をBFに表示する。
ということをしているのです。
というわけで、
Private Sub CommandButton2_Click()
On Error Resume Next
Dim Wb1 As Workbook
Dim WB2 As Workbook
Dim WS3 As Worksheet
Dim WS2 As Worksheet
Dim WS2 As Worksheet
Dim CeV As Range
Dim Cel As Range, CelAry() As Range
Set Wb1 = Workbooks("入力.xls")
Set WS2 = Wb1.Sheets("入力")
Set WB2 = Workbooks("集計.xls")
Set WS3 = WB2.Sheets("在庫")
Set WS5 = WB2.Sheets("仕入")
(myCopyは標準モジュールに定義済み)
myCopy WS2.Range("B1:B43"), _
WS3.Range("A65536").End(xlUp).Offset(1), True
G = 0
For Each Cel In Sheets("仕入").AutoFilter.Range.Columns("B").SpecialCells(xlVisible)
G = G + 1
ReDim Preserve CelAry(1 To G)
Set CelAry(G) = Cel
Next
G = 0
For Each Cel In Sheets("在庫").AutoFilter.Range.Columns("B").SpecialCells(xlVisible)
G = G + 1
If G <> 1 Then Cel.Value = CelAry(G)
If UBound(CelAry) = G Then Exit For
Next
Erase CelAry
WS5.Activate
Range("A1", Range("D65536").End(xlUp)).Offset(,2).Formula = _
"=IF(BF1,D1-BE1,""D1"")"
ActiveSheet.AutoFilterMode = False
WS3.Activate
ActiveSheet.AutoFilterMode = False
With WS3.Parent
.Save
.Close False
End With
Wb1 .Activate
End sub
となっています。
もしかして、したいこととコードが異なっていますか?
▼Jaka さん:
>>For Each Cel In Sheets("Sheet1").AutoFilter.Range.Columns("B").SpecialCells(xlVisible)
>>
>>の("B")は何をさしているのでしょうか?
>オートフィルタした範囲の左から2番目の列。
>B列といった表現は、フィルタ範囲がA:BF列だったので2番目と書くよりB列と書いた方がわかりやすいと思ったんですが....。
>
>因みに
>MsgBox Range("C:G").Columns("A").Address
>とすると、C:G間でのA列と言う事で全体でみたC列を挿します。
>
>>また、ReDim Preserve CelAry(1 To G)にオートメーションエラーが出てしまい、範囲対象外となってしまいました。
>これについては、解りません。(なった事がない?)
>
>実際、どういった状態で試されているのか解らないし、カスタマイズ及び今作っているプログラムに組み込んで試された結果なのか、それらが解らないので何ともいえないです。
>
>質問者で意味不明なのは、カスタマイズや、今作っているプログラムに組み込んで動きません、エラーになります。と言われても、こちらは単品で動く物を書いているから、かみ合わない事も多々あります。
>この辺はどうなのでしょうか?
|
|