プロが教えるわが家の防犯対策術!

こんにちは、
先日、「作りながら覚える! excel vba マクロ 組み方講座 永井善王著」という本を購入してvbaマクロを勉強中です。
本にそって進めていくと、P.122の所でストップしてしまいました。
急に「実行時エラー13 型が一致しません」と表示され、何回やりなおしてもそこから進めなくなりました。

コードは、

Sub DBシートから当月分シートを作成する()

Dim 開始年月日 As Long
Dim 終了年月日 As Long
開始年月日 = ">=" & Worksheets("年月日入力").Range("D4")
終了年月日 = "<=" & Worksheets("年月日入力").Range("D5")
ChDir "C:\ときめき"
Workbooks.Open Filename:="C:\ときめき\売上DB.xls"
Sheets("当月分").Select
Cells.Select
Selection.Clear
Sheets("DB").Select
Range("A2").Select
Selection.AutoFilter
Selection.AutoFilter Field:=1, Criteria1:=開始年月日, _
Operator:=xlAnd, Criteria2:=終了年月日
Selection.CurrentRegion.Select
Selection.Copy
Sheets("当月分").Select
Range("A1").Select
ActiveSheet.Paste
Sheets("DB").Select
Application.CutCopyMode = False
Selection.AutoFilter
Sheets("住所録").Select
ActiveWorkbook.Save
ActiveWindow.Close
End Sub

になります。

3行目の 
開始年月日 = ">=" & Worksheets("年月日入力").Range("D4")
が黄色くなっています。
(なぜかこの本では、Dim   As Long での変数定義がされておらず、そこは自分で入れています。)

現在本に沿って勉強しているところですが、詰まってしまいお手上げの状態です。
どうぞ助けてくださいませ。

A 回答 (8件)

こんにちは。



>(なぜかこの本では、Dim   As Long での変数定義がされておらず、そこは自分で入れています。)

あるレベルまでは、変数の定義をきっちり決めるようなことをすると、さっぱり分からなくなります。(正しくは、Dim   As String)
データ型は、避けていると一向に上達はしませんが、コツがありますから、あるレベルまでは、データ型を入れるということは絶対的ではありません。

質問のコードとしては、ちょっと、この先に進めていくのは厳しいですね。理由は、その手のワークシートのコーディングは、「記録マクロ」で作ったほうがよいのです。

私は、かねがね思っているのはワークシートの操作は、意外に難しいのです。Range オブジェクト・Cells プロパティ、Sheets オブジェクト・Worksheets オブジェクト、Windows オブジェクト・Workbooks オブジェクト と、同じようなものがいくつも出てきます。それをどう扱ってよいのか分かりにくいので、本来は、その中のひとつを、それぞれ選んでコードを書かないと、いつまでも、あやふやなコードになってしまいます。

ご質問のようなコードは、もしも、教本にあるのなら、もう少し先から進めたほうがよいです。それをやっていると、いつまでも、堂々巡りになってしまいます。

もちろん、

# 開始年月日 = ">=" & Worksheets("年月日入力").Range("D4")
# 終了年月日 = "<=" & Worksheets("年月日入力").Range("D5")


開始年月日, 終了年月日 の変数のデータ型は、String 型ではあるのですが、以下の部分が、コアになりますから、その部分が分かっていないと全体がボケてしまいます。

Selection.AutoFilter
Selection.AutoFilter Field:=1, Criteria1:=開始年月日, _
Operator:=xlAnd, Criteria2:=終了年月日

「開始年月日」は、文字列です。

それと、この辺りは、微妙にバージョンに影響する部分ですから、私が教える立場なら、できるなら避けたいのです。

 Worksheets("年月日入力").Range("D4")

これは、暗黙のプロパティですから、見かけ上は、日付型で出てきますが、実際は数値と同じです。String 型としては、数値だけになってしまいます。だから、Excel2000では、マクロでやると、何度やってもうまくいきません。

Selection.AutoFilter Field:=1, Criteria1:=">=5月24日"
このようには代入されません。=">=39957" となってしまいます。
これでも、フィルターされるはずです。

煮ても焼いても食えないものとして、オートフィルターや入力規則、条件書式、Webクエリ、統合などが挙げられます。ベテランの人でも、入門者でも、ここらは、ほとんど技術的に違いが現れません。

テキストの P.122 というと、本の中ごろでしょうか?VBAの「コンテナ」や「With 」の使い方というのは出ていませんか?まず、そこら辺りのテクニックを学んでから実践に移られてもよいと思います。VBAの上達の近道は、できる限りワークシートを扱わないことです。今回のような長いコードを使わずに、一行マクロ(Sub, End Sub で三行)から、進めたほうが早いようです。そうしたほうが、学習が進みます。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
大変勉強になりました、 String で解決いたしました。
本書でvba勉強をを合間をみて行っているだけで、まだまだvbaの基礎も何もわかっていないのが現状です。
今本書を用いて行っている勉強も本書にそって、なぞっているだけで確かに身になっているかといったら、?マークがつきます。
バージョンによって使用できるできないというのも正直初耳でした。
テキストのp.122は中頃ですが、コンテナ、with といったものはまだ出てきていません。
おしゃっる通り、これからどのように勉強していくか、考え直さないといけないかもしれませんが、1度はじめたものから逃げ出すのも嫌な性格なもので、とりあえず本書に沿って1つの販売管理をつくりその後、もう一度良い参考書を探し勉強していきたいと思います。
これからも、詰まってしまう所があると思いますので、お時間ありましたらまた助けて下さいませ。
ありがとうございました。

お礼日時:2009/05/28 18:12

>開始年月日 = ">=" & Worksheets("年月日入力").Range("D4")



セルD4には日付が入っているとして

これでなぜエラーが出るかというと、

右辺
">=" & Worksheets("年月日入力").Range("D4")
これではセルD4は日付(数値)ですが、先頭の">="が文字列ですから
例えば、
  ">=2009/5/28"
のように●文字列●が作成される

一方代入される左辺の変数(開始年月日)は、Long型の数値

で、数値型に文字列は代入できないのでエラーが出るわけです。


よって、string型にするか
Dim 開始年月日 As String
Dim 終了年月日 As String

Variant型にしなけばいけません
Dim 開始年月日 As Variant
Dim 終了年月日 As Variant

Variant型の場合は、As Variantを省いてもOK
 
 
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます。
大変勉強になりました、 String で解決いたしました。
また、Variantでも省略でもいけました。
ありがとうございました。
大変わかりやすい説明ありがとうございました。
勉強中の私は、本書に沿って四苦八苦しておりますががんばりたいと思います。
ありがとうございました

お礼日時:2009/05/28 17:55

エクセルの、クライテリアに当たるものは、文字列で表現するものが多い。

その文字列を、エクセルは、プログラムコードの一部にそのまま置き変える(はめ込む間に)のだと想像します。
関数でも例えばCOUNTIFの第2引数でも、>70でなく、">70"と文字列の例があります。
そういう例で
Dim 開始年月日 As Long
は正しくは Stringです。&で演算子文字列と結合してるじゃないですか。
>開始年月日 = ">=" & Worksheets("年月日入力").Range("D4")
としています。
&は文字列結合に使うものです。
これを勝手に入れたのが原因かも知れません。
永井先生の本にしては、マクロの記録みたいで、スマートじゃないが、ほんとにこの通り、本位載ってましたか。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
大変勉強になりました、 String で解決いたしました。
ありがとうございました。
本書には、確かに
>開始年月日 = ">=" & Worksheets("年月日入力").Range("D4")
との記載がありました。
勉強中の私は、本書に沿って四苦八苦しております。
ありがとうございました

お礼日時:2009/05/28 17:53

「開始年月日」と「終了年月日」はオートフィルタの抽出条件に使って居ますからLongではなくStringにしないと駄目ですね。



Dim 開始年月日 As Long
Dim 終了年月日 As Long

をLong→String で試して見てください。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
大変勉強になりました、 String で解決いたしました。
ありがとうございました

お礼日時:2009/05/28 17:58

変数定義をご自分でされたようですが、


「Sub DBシートから当月分シートを作成する()」の外に既に定義されていませんでしたか?
他の部分でも「開始年月日」「終了年月日」が必要になる場合、
Dimではなく、PrivateやPublicなどの広範囲で定義する場合があります。
確認してみてください。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
大変勉強になりました、 String で解決いたしました。
大変わかりやすい説明ありがとうございました。
勉強中の私は、本書に沿って四苦八苦しておりますががんばりたいと思います。
ありがとうございました

お礼日時:2009/05/28 17:57

VBAは変数を定義しないでも動きますからね。


私もこの程度の長さのVBAコードなら、変数定義なんぞしません。
ちゃんとユーザに納品するモノならoption宣言して定義しますが。

・・・それはともかく。

開始年月日 = ">=" & Worksheets("年月日入力").Range("D4")

これ、右側が変換しきれないデータなんじゃないですか? ステップ
実行で「?Worksheets("年月日入力").Range("D4")」をイミディエイト
ウインドウでチェックしてみてください。

素直に数字が出てきたら、Cstr(Worksheets("年月日入力").Range("D4"))
と書き換えれば動くはずです。出てこないなら、"年月日入力"という
シートがあるか確認したほうがいいかもです。ひょっとしてSheets("sheet1")
で済む話だったりして・・・。結構「シート名設定ミス」ってあるんですよね。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
そうですか、普通はこれぐらいだと変数定義しないものなんですね。自分の勉強不足の所も多々ありました。
解決いたしました。ありがとうございました。

開始年月日 = ">=" & Worksheets("年月日入力").Range("D4")

は、右側も変換できました。
本書の通り年月日というシートを作成いたしました。
わからない所だらけなのでご指摘ありがとうございました。

お礼日時:2009/05/28 17:49

Dim 開始年月日 As Long


Dim 終了年月日 As Long

この両方から As Long を削除したらどうなりますか?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
削除でいけました。
ただ今回は、勉強もふくめましてAs Stringを使用しました。
解決いたしました。ありがとうございました

お礼日時:2009/05/28 17:43

>なぜかこの本では、Dim   As Long での変数定義がされておらず、そこは自分で入れています。



変数宣言を指導しないのはなぜでしょうね?

ちなみに日付なら As Date としてください。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
本書では、変数宣言を指導していなかったので過去にも一度つまづきました。自分の勉強不足の所も多々ありますのでなんともいえませんが。
解決いたしました。ありがとうございました。

お礼日時:2009/05/28 17:42

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