- ベストアンサー
コンパイルエラー:が出るようになった
- Worksheets("集計型")のA列に下記DATAが合って01 Lemurian Dreams 00:00 B列に 00:00:00 C列に 01 Lemurian Dreams を抜き出すマクロを作成しています。
- こちらでマクロのコードを教えてもらって以前は下記のマクロで問題なく抽出出来ていたのに何故か、現在下記のコードのReplaceでエラーが出ます。n = Len(strTime) - Len(Replace(strTime, ":", "")) コンパイルエラー:引数の数が一致しません。又は不正なプロパティを設定しています。
- 原因の特定をしたいのですがアドバイスをお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
どこかに Sub Len() Sub Replace() のような同名のプロシージャを作成していないでしょうか。 エラーで選択されるほうです。
その他の回答 (4)
- kkkkkm
- ベストアンサー率66% (1719/2589)
> 私個人としては「ちゃんと指定したほうが判りやすい」とのアドバイスと受け取りました。 他の方が見たときに元の回答に「べき」と記載があるので、そうしなければいけないと勘違いする可能性を考えての紹介です。
- kkkkkm
- ベストアンサー率66% (1719/2589)
区切り 記号はオプションですよ。 Split 関数 https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/split-function
補足
kkkkkmさん、 SPRIT関数で半角スペースがデフォルトで区切り文字として指定されているので 省略可能であることは理解しています。 多分、imogashiさんの指摘は 私個人としては「ちゃんと指定したほうが判りやすい」とのアドバイスと受け取りました。
- imogasi
- ベストアンサー率27% (4737/17069)
今回のエラー原因ではないでしょうが、A列について、データチェックをしておいて、本番の処理に進むべきではないですか。 作業を別ステップ(単位、Run)にすること(特にインプットや編集に入るまでなど)も、コードを簡単にする、見通しをよくする方法だと思う。 都合のよいデータにしてから処理を考える、ということ。 特に日付や時刻は、日付・時刻シリアル値、という問題(それにしてから、処理を考えるべきだ)で注意が必要。今回は名前のスペースの問題なども引っかかる。 参考 A列だけを、空きの別シートのA列にコピペして Sub test01() For i = 2 To 2 ’2はデータ最終行数に変える x = Cells(i, "A") y = Split(x, " ") '---Check If IsNumeric(Val(y(0))) Then Cells(i, "D") = "'" & y(0) Else Cells(i, "D") = "Err" End If '-- If VarType(y(1)) = 8 And VarType(y(1)) = 8 Then Cells(i, "E") = y(1) & " " & y(2) Else Cells(i, "E") = "Err" End If '--- If VarType(y(3)) = 8 Then Cells(i, "F") = TimeValue(y(3) & ":00") Cells(i, "F").NumberFormat = "hh:mm:ss" Else Cells(i, "F") = "Err" End If '--- Next i End Sub
お礼
imogasiさん、回答感謝します。 確かにA列は、必要な要素毎に分割して抽出していたほうがミスは少なくなりますね。 アドバイスを受けて以下のようなてすとコードにして 他のコードもそれに合わせて修正中です。 >v = Split(Cells(i, 1).Value) v = Split(Cells(i, 1).Value," ")ですね。 Option Explicit Sub test01() Dim ws As Worksheet Dim i As Long Dim x As String Dim y As Variant Dim z As Integer, tm As Integer Set ws = Worksheets("test") For i = 2 To ws.Cells(Rows.Count, "A").End(xlUp).Row '2はデータ最終行数に変える x = ws.Cells(i, "A") tm = Len(x) - Len(WorksheetFunction.Substitute(x, ":", "")) y = Split(x, " ") z = UBound(y) - LBound(y) + 1 '分割数 '--- Number If IsNumeric(Val(y(0))) Then ws.Cells(i, "C") = "'" & y(0) Else End If '---時間部 If tm = 1 Then '1時間以下 ws.Cells(i, "E") = TimeValue("00:" & y(z - 1)) Else '1時間以上 ws.Cells(i, "E") = TimeValue(y(z - 1)) End If ws.Cells(i, "E").NumberFormat = "hh:mm:ss" '-- 文字部 y(LBound(y)) = "" y(UBound(y)) = "" ws.Cells(i, "D") = Join(y, "") Next End Sub
- imogasi
- ベストアンサー率27% (4737/17069)
v = Split(Cells(i, 1).Value) の行は、何何の文字で、Splitするのその文字を第2引数で指定すべきでは。
お礼
kkkkkmさん、アドバイス感謝します。 アドバイスのように sub Replace()が存在しています。 sub NewReplace()に名前を変更してエラーが出なくなりました。 値の確認などは、msgboxやDebug.Printを使って確認できるのですが 今回の「コンパイルエラー」の場合は、どうチェックすれば良いのか判らなくて マクロを操作中に何処か?修正ミス(一部のミス削除など)が合ったのかと 色々見直していましたが判りませんでした。 単純に後から作成したSUB名に原因が有るとは思いも依らないことでした。