アプリ版:「スタンプのみでお礼する」機能のリリースについて

excelVBAでファイル内の各シートを確認して、条件に合うシートのデータをコピーするところで、「実行時エラー'91'オブジェクト変数またはWithブロック変数が設定されていません。」というエラーが出ました。

確認したのですが、なかなか分かりません。どなたがご指導お願いできませんか。
コードは以下のとおりです。
Sub Tenki(theBook As Workbook, mySheet As Worksheet)
Dim K_Sheet As Worksheet
Dim DstRange As Range

For Each K_Sheet In theBook.Worksheets  ’ここで、エラーが出ました!
If K_Sheet.Name <> "C" Then
Set DstRange = mySheet.Range("A" & _
mySheet.Range("A1").CurrentRegion.Rows.Count + 1)
K_Sheet.Range("B7:K48").SpecialCells(xlCellTypeVisible).Select
Range("B7:K48").Copy
DstRange.PasteSpecial Paste:=xlPasteValues

End If
Next
Application.CutCopyMode = False

End Sub

どうぞよろしくお願いします。

A 回答 (4件)

theBookに値がセットされていないのでは?



Dim DstRange As Range
msgbox theBook.name 'これを追加して、ここで同じエラーが出るのであれば、theBookに値がセットされていない
For Each K_Sheet In theBook.Worksheets  ’ここで、エラーが出ました!

他にも、んっと思うところもありますが
取り敢えず、エラーの部分のみ
以上参考まで

この回答への補足

早速のご回答、ありがとうございました。
hige_082さんのおっしゃったとおりです。セットするのが忘れた。
新しくセットして、うまく回したが、
hige_082さんの「んっと思うところもありますが」は
ちょっと気になるので、ぜひ教えていただけないでしょうか。
わがままですみません、よろしくお願いします。

補足日時:2010/01/02 10:42
    • good
    • 0

#2です


>「んっと思うところもありますが」は
>ちょっと気になるので、ぜひ教えていただけないでしょうか。
私が、んっと思った所を含め、それ以上の回答を
#3さんがされていますので
#3さんの回答を参考にしてください
    • good
    • 0
この回答へのお礼

はい、了解です。いろいろ助けてくださって、ありがとうございます。

お礼日時:2010/01/03 14:30

こんにちは。



サブルーチンにするまでのほどではないような気がします。
それに、この程度で、コピーする側も、貼り付けする側もサブルーチンの引数で指定するから、ややこしくなるのです。片方をActiveSheet にすれば、コピー元ブックだけになります。

全コードを書いていないから、書かれていない部分を想像するしかありませんが、サブルーチンに入れるためのコードのミスです。空のオブジェクトだからです。ブックの変数に、固有のブックを指定していません。

全体がかかれていないので、やむを得ず、サブルーチンを直すしかありませんが、以下のように一行入れればよいです。本来は不必要です。

If theBook Is Nothing Then Exit Sub '←この行を挿入
For Each K_Sheet In theBook.Worksheets  ’ここで、エラーが出ました!

If K_Sheet.Name <> "C"は、大文字・小文字の違いがありますから、場合によっては、K_Sheet.Nameは、StrConv(K_Sheet.Name, vbUpperCase) <> "C" としたほうが安全です。

>K_Sheet.Range("B7:K48").SpecialCells(xlCellTypeVisible).Select
>Range("B7:K48").Copy

これでは、Select した瞬間に、エラーが発生する可能性がありますから、

K_Sheet.Range("B7:K48").SpecialCells(xlCellTypeVisible).("B7:K48").Copy
としたほうが良いような気がします。

余計なのかもしれませんが、
DstRange.PasteSpecial Paste:=xlPasteValuesのDstRange で、

Set DstRange = mySheet.Range("A" & _
mySheet.Range("A1").CurrentRegion.Rows.Count + 1)

コピーするには、行列のマトリックスで取得して張り付けるのですから、どこかに最終行の基準がある列があってもよいと思うのです。貼り付けるたびに、位置の確認で、CurrentRegion というのは、少し懲りすぎているように思うのです。これは、個人的な感想で、内容が部分的でしかないので、ここらは手が付けられません。もちろん、#1さんご指摘のように、A列の最終行を決めるなら、Rangeオブジェクトにする必要がありません。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。自分自身の力不足も実感しました。引き続き、頑張りますが、お邪魔することがあると思います。ぜひまたよろしくお願いします。

お礼日時:2010/01/02 11:45

オブジェクトK_sheetの中身をsetしないといけないのではないでしょうか。


シート数をカウントしてfor 1 to cntで回せば、そこの部分のエラーは回避できるかと思います。
    • good
    • 0
この回答へのお礼

hige_082さんがおっしゃったとおり、値のセットを忘れました。
こんなところで引っかかって本当に、恥ずかしいです。
アドバイス、ありがとうございます。参考させていただきます。

お礼日時:2010/01/02 10:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!