|
Jakaさん
検証に時間がかかってしまい、今の投稿になりまして申し訳ございません。
やはりオートフィルタをかけた後に最終行を取得しようとしていたのが問題だったようです。
with でそれぞれのシートのオートフィルタをくくり、
オートフィルタを解除してから計算させるという手順に変えると解決しました。
本当にありがとうございました。
▼初心者 さん:
>Jakaさん、いろいろとありがとうございます。
>
>>1、
>>下記変数の宣言がされていないようですが...。
>>Dim Cel As Range, CelAry() As Range
>> ↑特にこの配列、これがないとエラーになると思います。
>> 変数が定義されていないって....。
>
>上の方のワークブックやシートの変数の宣言の所に表示しているのですが、
>コードのすぐ上に宣言したほうがよかったのでしょうか?
>
>>2、
>>>’オートフィルタをかけた仕入シートのBE列の最後の行
>>> Set 範囲 = WS5.Range("BE65536").End(xlUp).Offset(1)
>>これは、いつ取得しているのでしょうか?
>>いつと言うのは漠然としすぎるので、オートフィルタをかけた後でしょうか?
>>オートフィルタのコードが書いてなかったので、手動でオートフィルタをかけているのかな?
>>と、思います。
>>オートフィルタをかけた後に、フィルタ最終行を
>>Range("BE65536").End(xlUp)・・・
>>で、取得するととんでもない事になったりするので止めてください。
>>http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=87;id=FAQ
>
>↑拝見致しました。
>オートフィルタをかけた後に取得しておりました。
>すぐに書き換えますね。
>
>>3、
>>>WS5.Activate
>>>Range("A1", Range("D65536").End(xlUp)).Offset(,2).Formula = _
>>> "=IF(BF1,D1-BE1,""D1"")"
>>これ、フィルタして表示されているセルに対して関数を書き込んでいるのしょうか?
>>フィルタして飛び飛びのセルに対して、一括で書き込むことが出来ないです。
>>1個1個ループ書かないとダメだと思います。
>>(Unionメソッドの事は、混乱を招きそうなので省きます。)
>
>フィルタして飛び飛びのセルに対して一括で書き込むことはできないということを初めて知りました。
>勉強不足で申し訳ありません。
>
>ループさせないと無理なんですね。。
>↑ここもちょっと勉強してみます。
>
>>
>>オートフィルタの全て表示は、こんな感じで出来ます。、
>>
>>Sub 全表示() 'オートフィルタ解除または全表示時、
>> '関数が多いとフリーズしたようになるから計算方法を手動にする。
>> Dim CalFLG As Boolean
>> With Application
>> If .Calculation = xlAutomatic Then
>> .Calculation = xlManual
>> CalFLG = True
>> End If
>> Sheets("シート2").ShowAllData '全表示
>>
>> If CalFLG = True Then
>> .Calculation = xlAutomatic
>> End If
>> End With
>>End Sub
>>
>>オートフィルタの解除は、こんな感じでできます。
>>Sheets("シート2").AutoFilterMode = False
>>
>>>Sub オートフィルタオフ1()
>>> Dim Wb1 As Workbook
>>> Dim WB2 As Workbook
>>> Dim WS3 As Worksheet
>>> Dim WS2 As Worksheet
>>> Dim WS2 As Worksheet
>>> Set Wb1 = Workbooks("入力.xls")
>>> Set WS2 = Wb1.Sheets("入力")
>>> Set WB2 = Workbooks("集計.xls")
>>> Set WS3 = WB2.Sheets("在庫")
>>> Set WS5 = WB2.Sheets("仕入")
>>
>>>'在庫シートのオートフィルタ解除。
>>> If WS3.AutoFilterMode = True Then
>> ↓ WS4 が上でセットされてないからエラーになります。
>>> WS4.Range("B23").AutoFilter
>>> End If
>>>End Sub
>> ↓
>>決まったシートのオートフィルタを解除するなら、
>>こんな感じでいいです。
>>
>>Sub オートフィルタオフ1()
>> WorkBooks("Book1.xls").Sheets("シート2").AutoFilterMode = False
>> Doevant '←入れておいた方が、良いと思います。
>>End Sub
>>
>>オートフィルタして表示された列の最後の行は、こんな感じ....。
>>
>>With Sheets("Sheet2").AutoFilter.Range
>> With .Columns(1).SpecialCells(xlCellTypeVisible)
>> With .Areas(.Areas.Count)
>> MsgBox .Rows(.Cells.Count).Row
>> End With
>> End With
>>End With
>
>
>>最終行を求めるだけなら、こんなまだるっこい事するより
>>>最後の行は、こんな感じ....。
>>>
>>>With Sheets("Sheet2").AutoFilter.Range
>>> With .Columns(1).SpecialCells(xlCellTypeVisible)
>>> With .Areas(.Areas.Count)
>>> MsgBox .Rows(.Cells.Count).Row
>>> End With
>>> End With
>>>End With
>>
>>やっぱし、こっちの方が速いかも、項目名の1つ下の状態を確認すれば言いだけだから。
>>場合によってですかね?
>>msgbox Range("A1", Range("D65536").End(xlUp)).row
>
>メッセージボックスで表示させる必要はないのですが、表示させた方がいいのでしょうか?
>
>質問ばかりで申し訳ありません。
>少しづつですが、エラーの原因がわかってきました。
>解読するのに時間がかかってしまって、まだコードは書けていないので、
>もう一度調べて書いてみますね。
|
|