[[20060906201109]] 『オートフィルタ後の貼り付け』(shirot) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『オートフィルタ後の貼り付け』(shirot)

エクセルのバージョン: Excel2003 OSのバージョン:WindowsXP

いつもお世話になっています。

現在、過去ログをみながらマクロを作っているのですが、
1点どうしてもできないので、

ご教授ください。

sheet1=元データが入っています。
 列Bでオートフィルタをかけ、オートフィルタで抽出したものを、
 隣の「omise」のシートにコピーしたいと思います。

下記、私が作ったマクロになります。

        .Range("A1").AutoFilter Field:=2, _
            Criteria1:="=*A*", Operator:=xlOr, Criteria2:="=*B*" 'AかBをフィルタ
        .Range("A1:G" & Last_R).Copy Destination:= _
            Worksheets("omise").Range("A1")          'Sheet1のデータをomiseシートにコピー

        .Range("A1").AutoFilter Field:=2, _
         Criteria1:="=*C*", Operator:=xlOr, Criteria2:="=*D*"  'CかDをフィルタ
        .Range("A1:G" & Last_R).Copy
        Sheets("omise").Select
        貼付行 = Range("A65536").End(xlUp).Row + 1
        Range(Cells(貼付行, 1), Cells(貼付行, 1)).Select

        Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, _
          SkipBlanks:=False, Transpose:=False

@sheet1で、「A」「B」をフィルタして、「omise」のシートにコピー

Asheet1で、「C」「D」をフィルタして、「omise」のシートに前の続き(最後の行?)からコピー
          ・
          ・

という風に作りたいのですが、

「400」というエラーがでてしまいます。。

どこを直せばよいのでしょうか。。

よろしくお願いします。
    


 ユーザーフォームを使用していますか?
以下はヘルプ引用。
//////////////////////////////////////////////////////////////////////////////
[既にフォームは表示されています。モーダルにできません。(Error 400)]
Show メソッドを使用して、既に表示されているフォームをモーダルとして表示することはできません。このエラーの原因と対処方法を次に示します。 
 
既に表示されているフォームに対して、引数 style に 1 (vbModal) を設定して、Show を使用しようとしています。 
Unload ステートメントまたは Hide メソッドをフォームで使用してから、モーダル フォームとして表示します。 
//////////////////////////////////////////////////////////////////////////////
(みやほりん)(-_∂)b


 回答ありがとうございます。
 ユーザフォームは使用していません。
 上記のマクロの前にも、他の行でフィルタをかけていたりします。
 そのことが問題あるのでしょうか。

(shirot)


 VBAのエラーナンバー400からは上記のことしかわかりません。
コード自体も問題ないように見えます。
すくなくとも、こちらでコードを補完して、テキトーに作ったリストで実行しても
エラーは起こりません。
 
エラー発生後、エラーメッセージを確認してください。
エラーメッセージ全文を控えてください。
また、「デバッグモード」にして、停止しているコードを特定してください。
(みやほりん)(-_∂)b

お世話になっています。
返信できる環境になく、
返信が遅れてしまい、申し訳ありません。

 「実行時エラー'1004'アプリケーション定義またはオブジェクト定義エラーです」
 というエラーと共に、
 デバックモードで確認していったら、
 マクロの最後の方の
  Range(Cells(貼付行, 1), Cells(貼付行, 1)).Select

 というところでエラーがでました。
 貼り付け先の定義が曖昧、ということなのでしょうか。
 よろしくお願いします。
 (shirot)


 shirotさん、こんにちは。
タイトル見ても自分がレスをつけたトピックということを思い出せませんでした。
わたくし、ちょっと思い出すのに最近時間がかかるので・・・
よし、アドレナリン補給してきました。いきます。
 
Range(Cells(貼付行, 1), Cells(貼付行, 1)).Select で
「アプリケーション定義またはオブジェクト定義エラー」の出る可能性としては
変数「貼付行」が目的の行位置を取得できていない、です。
変数「貼付行」が0以下だったり、65536より大きかったりするとそのエラーが出ます。
シートオブジェクトに定義されているセル範囲外を取得しようとしているよ、
ということです。
ただ、変数「貼付行」の取得の仕方を見る限りではそのようなことはないはず。
 
もしかしたら、「実行時エラー'1004'RangeクラスのSelectメソッドが失敗しました」
ということはありませんか?
この場合問題となるのは、ご提示のコードをどのモジュールへ登録しているか、です。
シートに配置したコマンドボタンクリックイベントなどからだと私の提示したエラーが
発生します。もしそうなら、コードの手直しが必要。
標準モジュールならこの可能性はないです。
 
ご提示のコードから判断できるのは以上。
(みやほりん)(-_∂)b

 Range(Cells(貼付行, 1), Cells(貼付行, 1)).Select
↓
 .Range(Cells(貼付行, 1), Cells(貼付行, 1)).Select
 ではどうなりますか・・・

(BC)


 >BCさん
貼付位置がomiseシートならRangeプロパティにピリオドつけるのはshirotさんの説明と
合いません。
 
構文的にも、もしWith でくくったシート(Sheet1?)が対象なら、
 .Range(.Cells(貼付行, 1), .Cells(貼付行, 1)).Select
とCellsプロパティにもピリオド書かないと、
「アプリケーション定義またはオブジェクト定義エラー」になります。
Rangeの引数とするRangeオブジェクトもWith でくくったシートのセルである必要が
あります。
また、そのままではomiseシートをSelectした後なのでそのセル範囲はSelectできず、
「実行時エラー'1004'RangeクラスのSelectメソッドが失敗しました」となります。
 
        Sheets("omise").Select
        貼付行 = Range("A65536").End(xlUp).Row + 1
        Range(Cells(貼付行, 1), Cells(貼付行, 1)).Select
        Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, _
          SkipBlanks:=False, Transpose:=False
 
この部分は
omiseシートを選択する
omiseシートのA列データ最終行+1の数値を取得する
omiseシートのA列のデータ最終行直下の空白セルを選択する
omiseシートの選択セル位置へ値貼付する ・・・という作業だと私は理解しています。
 
>shirotさん
ちなみに、変数 Last_R はどうやって取得されているのでしょう。
エラーが出るのは  .Range("A1:G" & Last_R).Copy  ということはありませんか?
(みやほりん)(-_∂)b

 貼付行 = Range("A65536").End(xlUp).Row + 1
 Range(Cells(貼付行, 1), Cells(貼付行, 1)).Select

 シート名が・・・・ないからでは?
 ActiveSheetが対象になっているのでは?

(yamada)


理解するのに時間がかかっています。。
よろしくお願いします。

 >yamadaさん
 シート名は、Sheets("omise").Select
 としていたので問題ないかと思っていたのですが、、問題あるんでしょうか。

 >みやほりんさん
 変数 Last_R の取得なのですが、
 手元に実際のものがなくてすぐにはわかりませんが、
        .Range("A1").AutoFilter Field:=2, _
         Criteria1:="=*A*", Operator:=xlOr, Criteria2:="=*B*" 'AかBをフィルタ
        .Range("A1:G" & Last_R).Copy Destination:= _
        Worksheets("omise").Range("A1")          'Sheet1のデータをomiseシートにコピー
 
 まではマクロは動いています。(正常にコピー&ペーストができていました)
 明日、朝一番で確認してみます。
(shirot)


 確認ポイントをもう一回まとめます。
・このコードが登録されているモジュール
・発生するエラーメッセージ
・エラーメッセージ発生後デバッグボタンを押してコードが表示された時にハイライトされている行。
・停止時の変数「Last_R」および、変数「貼付行」の値。(ローカルウィンドウで確認)
(みやほりん)(-_∂)b

 >みやほりんさん

 ・このコードが登録されているモジュール
 →標準モジュール
 ・発生するメッセージ →×400

 上記でした。
 何が違うのかさっぱりわからなかったので、
 新しいBOOKでコードを貼り付けしたところ、
 エラーが発生しなくなりました。。。
 本当にお手数おかけしました。
 解決(?)できたみたいです。
 原因が不明なのですが。。。
(shirot)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.