質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

2828閲覧

ExcelVBAを用いて日付を検索して別のシートへ転記

Apoll047

総合スコア12

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/05/22 07:02

sheet1,sheet2(1,2という名前)がありA1からE1まで順にID、名前、コメント、前回日、次回日という列がありこのうち次回日(E1)の日付を検索し、その日付と一致したsheet2の行の1から5列目までをsheet1に転記したい。なお検索ワードとなる日付はuserformのcombobox1にリストから選択していれるようにしています。
実際に書いたコード

Private Sub CommandButton1_Click() Dim LastRowX As Long LastRowX = Worksheets("1").Cells(Rows.Count, 1).End(xlUp).Row Dim LastRowY As Long LastRowY = Worksheets("2").Cells(Rows.Count, 1).End(xlUp).Row Range("A2", Cells(LastRowX, 5)).ClearContents Dim myRange As Range Dim myObj As Range Dim KeyDate    Set myRange = Worksheets("2").Range(Worksheets("2").Cells(2, 5),                 Worksheets("2").Cells(LastRowY, 5)) KeyDate = CDate(ComboBox1.Text) Set myObj = myRange.Find(KeyDate, LookIn:=xlFormulas)   If myObj Is Nothing Or ComboBox1 = "" Then     MsgBox ComboBox1 & "はいません。"    Exit Sub Else Dim mycell As Range Set mycell = myObj Do Worksheets("2").Range(Cells(mycell.Row, 1), Cells(mycell.Row, 5)).Copy Worksheets("1").Range(Cells(LastRowX + 1, 1), Cells(LastRowX + 1, 5)).Paste Set mycell = myRange.FindNext(mycell) Loop While mycell.Row <> myObj.Row End If End Sub

以上になります。
直してもエラーが出ての繰り返しで訳が分からなくなってしまいました。ちなみに素人です。
この状態ですとエラー13 方の不一致のエラーが出てしまいます。
場所は KeyDate = CDate(ComboBox1.Text)です。

このコードが思うように作動するにはどうすればいいか教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

コンボボックスにはどのような文字列を登録しているのでしょうか?
おそらくCDateで変換できない日付文字列になっていると思います。

投稿2020/05/22 08:22

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Apoll047

2020/05/22 15:06

失礼しました肝心なことを書き損じておりました。 以下のサイトを参考に第2.4木曜日の日付を取得してます。 https://vba-labo.rs-techdev.com/archives/170 As Dateであっております。 シリアル値に統一した方が分かりやすいと思いシリアル変換にしております。 ただそれを行っても Set myRangeが アプリケーション定義またはオブジェクト定義のエラーです。(1004)が出てしまいます。
ttyp03

2020/05/22 23:55

Date型で目的の日付を得ているのはわかりました。 ではそれをコンボボックスにはどのような書式の文字列に変換して表示しているのですか? またここに来てエラーが出る場所がCDateではなくSet myRangeに情報が置き換わっています。 どちらですか? ステップ実行させればよくわかるので確認してみてください。 Set myRangeの方は特に問題らしい問題はなさそうに見えますが。
Apoll047

2020/05/26 08:31

以下の変更を加えたところ正常に作動しました。 Dim KeyDate→Dim KeyDate As Date KeyDate = CDate(ComboBox1.Text)→KeyDate = CDate(ComboBox1.Value) しかし以下のエラーが発生しました。 Do以下の Worksheets("2").Range(Cells(mycell.Row, 1), Cells(mycell.Row, 5)).Copy この2行についてアプリケーション定義またはオブジェクトエラーです。(#1004) が発生しました。 私の知識では .select selection.copy のような記述は使用できないとある記事で見かけましたのでそうはせず直接コピペしています。 それがいけないような気がしていますが、どう改善するのがベストなのかいまいちわかりません。 ご教授願いたいです。
ttyp03

2020/05/26 08:55

Cellsがどのシートを指しているか曖昧だからですね。 次のようにしてください。 Worksheets("2").Range(Worksheets("2").Cells(mycell.Row, 1), Worksheets("2").Cells(mycell.Row, 5)).Copy 次行も同様に。 尚、毎回Worksheets("2")と長々書くのは可読性が悪いので、ワークシートのオブジェクトを作ってそちらを使うようにするとよいですよ。 Dim sh2 As Worksheet Set sh2 = Worksheets("2") sh2.Range(sh2.Cells(mycell.Row, 1), sh2.Cells(mycell.Row, 5)).Copy
Apoll047

2020/05/26 09:24

ありがとうございます。 上記のように改変できましたがしかし、オブジェクトが必要です(424)とのエラーを吐いてしまいました。 試しに Distinationで貼り付け先を指定しても同じでした。 そしてもう一つ最初から出ていたと思われる不本意な動作に気が付きましたので併せてお伺いしたいです。 8行目 Range("A2", Cells(LastRowX, 5)).ClearContents なのですが先ほどの回答を元に Sh1.Range(sh.1Cells(2,1), sh2.Cells(LastRowX, 5)).ClearContents に変更してものすごく見やすくなりました。ありがとうございます。メンテナンスのためにも使用させていただきます。 ですがなぜか1行目まで消えてしまいます。 やりたいことはセルのAーE列の記入のあるセルをクリアしたいのです。
ttyp03

2020/05/27 00:10

1個目 うーん、わかりません。 最新のコードを貼ってもらったほうがいいかもしれません。 sh1かsh2にSetする前に使ってるとか? 2個目 Sh1.Range(sh.1Cells(2,1), sh2.Cells(LastRowX, 5)).ClearContents sh1のRangeでsh2が登場してます。 見直してみてください。
guest

0

Comboboxの中身がわからないので何とも言えませんが、
CDateに渡しているCombobox1.textの中身のフォーマットが日付に変換できないのかもしれません
あと、KeyDateは日付型とわかるように Dim KeyDate as Date とした方がよさそうです。

CDate使い方の参考サイト
Dim宣言の参考

投稿2020/05/22 08:15

oec

総合スコア271

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Apoll047

2020/05/22 15:07

失礼しました肝心なことを書き損じておりました。 以下のサイトを参考に第2.4木曜日の日付を取得してます。 https://vba-labo.rs-techdev.com/archives/170 As Dateであっております。 シリアル値に統一した方が分かりやすいと思いシリアル変換にしております。 ただそれを行っても Set myRangeが アプリケーション定義またはオブジェクト定義のエラーです。(1004)が出てしまいます。
Apoll047

2020/05/22 15:08

参考サイトの提示ありがとうございます。 もし型がわからない等混乱が生じる場合はvariantにしておくのが無難なのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問