こんにちは、
先日、「作りながら覚える! 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 での変数定義がされておらず、そこは自分で入れています。)
現在本に沿って勉強しているところですが、詰まってしまいお手上げの状態です。
どうぞ助けてくださいませ。
No.7ベストアンサー
- 回答日時:
>開始年月日 = ">=" & 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
ご回答ありがとうございます。
大変勉強になりました、 String で解決いたしました。
また、Variantでも省略でもいけました。
ありがとうございました。
大変わかりやすい説明ありがとうございました。
勉強中の私は、本書に沿って四苦八苦しておりますががんばりたいと思います。
ありがとうございました
No.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 で三行)から、進めたほうが早いようです。そうしたほうが、学習が進みます。
ご回答ありがとうございます。
大変勉強になりました、 String で解決いたしました。
本書でvba勉強をを合間をみて行っているだけで、まだまだvbaの基礎も何もわかっていないのが現状です。
今本書を用いて行っている勉強も本書にそって、なぞっているだけで確かに身になっているかといったら、?マークがつきます。
バージョンによって使用できるできないというのも正直初耳でした。
テキストのp.122は中頃ですが、コンテナ、with といったものはまだ出てきていません。
おしゃっる通り、これからどのように勉強していくか、考え直さないといけないかもしれませんが、1度はじめたものから逃げ出すのも嫌な性格なもので、とりあえず本書に沿って1つの販売管理をつくりその後、もう一度良い参考書を探し勉強していきたいと思います。
これからも、詰まってしまう所があると思いますので、お時間ありましたらまた助けて下さいませ。
ありがとうございました。
No.6
- 回答日時:
エクセルの、クライテリアに当たるものは、文字列で表現するものが多い。
その文字列を、エクセルは、プログラムコードの一部にそのまま置き変える(はめ込む間に)のだと想像します。関数でも例えばCOUNTIFの第2引数でも、>70でなく、">70"と文字列の例があります。
そういう例で
Dim 開始年月日 As Long
は正しくは Stringです。&で演算子文字列と結合してるじゃないですか。
>開始年月日 = ">=" & Worksheets("年月日入力").Range("D4")
としています。
&は文字列結合に使うものです。
これを勝手に入れたのが原因かも知れません。
永井先生の本にしては、マクロの記録みたいで、スマートじゃないが、ほんとにこの通り、本位載ってましたか。
ご回答ありがとうございます。
大変勉強になりました、 String で解決いたしました。
ありがとうございました。
本書には、確かに
>開始年月日 = ">=" & Worksheets("年月日入力").Range("D4")
との記載がありました。
勉強中の私は、本書に沿って四苦八苦しております。
ありがとうございました
No.5
- 回答日時:
「開始年月日」と「終了年月日」はオートフィルタの抽出条件に使って居ますからLongではなくStringにしないと駄目ですね。
Dim 開始年月日 As Long
Dim 終了年月日 As Long
をLong→String で試して見てください。
No.4
- 回答日時:
変数定義をご自分でされたようですが、
「Sub DBシートから当月分シートを作成する()」の外に既に定義されていませんでしたか?
他の部分でも「開始年月日」「終了年月日」が必要になる場合、
Dimではなく、PrivateやPublicなどの広範囲で定義する場合があります。
確認してみてください。
ご回答ありがとうございます。
大変勉強になりました、 String で解決いたしました。
大変わかりやすい説明ありがとうございました。
勉強中の私は、本書に沿って四苦八苦しておりますががんばりたいと思います。
ありがとうございました
No.3
- 回答日時:
VBAは変数を定義しないでも動きますからね。
私もこの程度の長さのVBAコードなら、変数定義なんぞしません。
ちゃんとユーザに納品するモノならoption宣言して定義しますが。
・・・それはともかく。
開始年月日 = ">=" & Worksheets("年月日入力").Range("D4")
これ、右側が変換しきれないデータなんじゃないですか? ステップ
実行で「?Worksheets("年月日入力").Range("D4")」をイミディエイト
ウインドウでチェックしてみてください。
素直に数字が出てきたら、Cstr(Worksheets("年月日入力").Range("D4"))
と書き換えれば動くはずです。出てこないなら、"年月日入力"という
シートがあるか確認したほうがいいかもです。ひょっとしてSheets("sheet1")
で済む話だったりして・・・。結構「シート名設定ミス」ってあるんですよね。
ご回答ありがとうございます。
そうですか、普通はこれぐらいだと変数定義しないものなんですね。自分の勉強不足の所も多々ありました。
解決いたしました。ありがとうございました。
開始年月日 = ">=" & Worksheets("年月日入力").Range("D4")
は、右側も変換できました。
本書の通り年月日というシートを作成いたしました。
わからない所だらけなのでご指摘ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) ②Excel 簡単にシートコピーしたら前日の残高と日付を変更させたい→マクロの記録でエラーが出ます 8 2022/07/16 20:40
- Excel(エクセル) 日付で矢印マクロ 4 2023/07/25 16:47
- Visual Basic(VBA) データのある範囲を選択するVBAについて 2 2022/09/03 00:20
- Visual Basic(VBA) エクセル VBA 処理スピードを上げたいのですが。 6 2023/03/31 20:52
- Visual Basic(VBA) excelVBAについて。 4 2022/11/21 16:15
- Excel(エクセル) ExcelVBAについて。 2 2022/12/10 20:08
- Excel(エクセル) エクセル VBAでシートのコピーを作りたい 1 2023/05/18 07:42
- Visual Basic(VBA) マクロで最終行を取得してコピーしたい 3 2022/04/06 19:07
- Visual Basic(VBA) Sheet2の日付をキーにオートフィルターで2023年1月のデータを抽出し、Sheet3へ書き出すた 2 2023/03/06 23:57
- Visual Basic(VBA) excelVBAについて。 1 2022/11/30 06:16
このQ&Aを見た人はこんなQ&Aも見ています
-
「どうして捨てられないの?」前妻の物を捨てられない男性の心理って?
前妻の物を捨てられない理由に加え、捨てるための手段はあるのかを専門家に聞いてみた!
-
エクセルエラー13型が一致しませんの直し方教えて下さい。
その他(Microsoft Office)
-
ExcelのVBAでエラー13が出てしまいます。(泣き)
Excel(エクセル)
-
【VBA】実行中に「型が一致しません」というエラー
Visual Basic(VBA)
-
-
4
特定のPCだけ動作しないVBAマクロがあります。その理由は?
Visual Basic(VBA)
-
5
エクセル 「実行時エラー13":型が一致しません。」エラーについて"
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
excel vba で 実行時エラー13...
-
パソコンに詳しい方教えて下さ...
-
Windows上のファイル操作の履歴...
-
RS232cを用いた送信プログラム
-
java.lang.NumberFormatExcepti...
-
Batファイルでhostsを追加したい
-
複数のテキストファイルの特定...
-
シリアル通信時のデータ受信方法
-
PC98で232c送信winndowで受信で...
-
エクセルが開けません(泣)
-
WSHファイルからFTPを利用して...
-
recv関数の戻り値について
-
バッチファイルでディレクトリ...
-
Zipファイルをエクセルに指定変...
-
ARCserveの復元方法
-
Outlookの「受信日時」「件名」...
-
バックアップ
-
フォルダへのコピー時に重複に...
-
シリアルポートから送られてく...
-
バッチ処理でファイル整理
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
excel vba で 実行時エラー13...
-
エクセルの関数について、該当...
-
[条件付き書式]について、
-
パソコンに詳しい方教えて下さ...
-
バッチファイルでディレクトリ...
-
Windows上のファイル操作の履歴...
-
Outlookの「受信日時」「件名」...
-
TCP/IP のパケットの分断と結合...
-
ipadで社内ネットワークに接続
-
データベースファイル 機種変の...
-
指定ファイルをFTPで自動アップ...
-
Zipファイルをエクセルに指定変...
-
RS232cを用いた送信プログラム
-
java.lang.NumberFormatExcepti...
-
UDP受信時の通信異常検知について
-
ASP.NET C#でPOST受信
-
複数のテキストファイルの特定...
-
シリアル通信時のデータ受信方法
-
Lhaplusが発したと、みられるエ...
-
ARCserveの復元方法
おすすめ情報