マクロの初期段階で開かれている別のスプレッドシートで動作するスプレッドシート内にVBA関数があります。マクロは正常に機能していましたが、ごく最近、1004エラー( "WorksheetFunctionクラスのRoundDownプロパティを取得できません")実行されるとき。
エラーの原因(RoundDownの実行の問題)は理解できますが、マクロでトリガーされる理由がわかりません。奇妙な部分は、デバッグモードに入ってVBEのコードをステップスルーするときです。エラーは再発しません(明らかに変化はありませんが)。
この種のエラーが一貫性なく発生し、それを解決するために何ができるかを知っている人はいますか?
私は合理的にVBA/Excelに精通していますが、それを診断するためのさらなる手順に関する提案は歓迎されます。開いたスプレッドシートの準備ができていないという問題があるのではないかと思っていますが、どうすればいいのかわかりません。
コードはこちらです。エラーがコメントでマークされた行で発生します。
Public Function GetDatesA(sWorkbookname As String, sSheetname As String, sCell As String) As Variant
Dim vDateList() As Variant
Dim currentCell As Range
Dim n As Long
Set currentCell = Workbooks(sWorkbookname).Worksheets(sSheetname).Range(sCell)
n = 0
Do
If Trim(currentCell.Value) = "" Then
Exit Do
Else
ReDim Preserve vDateList(0 To 1, 0 To n)
vDateList(0, n) = WorksheetFunction.RoundDown(currentCell.Value, 0) 'error occcurs on this line
vDateList(1, n) = currentCell.Column
'Debug.Print currentCell.Value
End If
Set currentCell = currentCell.Offset(0, 1)
n = n + 1
Loop While currentCell.Column < XL_LAST_COLUMN
GetDatesA = vDateList
End Function
その他の詳細:
Excelバージョン:2010
開かれているファイルは、C:ドライブにローカルに存在します。私のマクロはネットワーク上のスプレッドシートにあります
両方のファイルのファイル形式は.xls(つまりExcel 2003)です-これを変更するオプションはありません
Windows 7(関連があるとは思わない)
すでに試した2つのポイントは次のとおりです。
別のワークシート関数(Min(currentCell)など)を使用すると、同じ問題が発生します
ファイルをすでに開いていると、問題が停止するようです-開かれているブック(マクロを含むメインブックではなく)がマクロに対して有効になっておらず、これが干渉している方法があるのではないかと思います。しかし、これが原因である場合でも、私はそれを回避する方法がわかりません!
何か案は?
このエラーは、ワークシート関数に渡された引数の型が正しくないか、意味をなさない場合によく発生します。
たとえば、1より大きい引数でWorksheetFunction.Asin
を呼び出すときにこの問題が発生しました。あなたの場合、currentCell.Value
は数値ではないか、地域の設定に従っていないと思います数字に関して。
はい、エラーメッセージは誤解を招きます。
Transpose、MMult、MDterm、およびMInverse関数を使用すると、「WorksheetFunctionクラスの*プロパティを取得できません」というエラーが表示されました。
エディターの特定のモジュールの宣言(実際のコードの前)セクションに「オプションベース1」を配置することで、コードを実行することができました。
Excelは、空のセルの行と列を追加する「オプションベース0」を想定しています。これによりエラーが発生し、すぐにはわかりません。
アンドレが上記のように言ったように、私は以前にこれに出くわしたことがあり、私にとっては基準範囲が意味をなさないのでした。
以下の式の例を参照してください:.Cells(11, i).Formula = Application.WorksheetFunction.CountIfs(Sheets("Sheet1").Range("AC8:C" & n), "S")
範囲を見てください...それは意味がありません。 "AC8:C"
から"AC8:AC"
の範囲を修正しました。完全に機能します