2017-12-01 1 views
2

文字列の長さをポイント単位で判断する簡単な関数を記述しました。グーグルで検索したところ、フォントメトリクスの問題を避けることを決めました。Excel VBA関数はエラーメッセージなしで完了前に実行を停止します

ここにコードがあります。

Option Explicit  
Function txtWidthPts(MyText As String) As Integer 
    'A cell on a working worksheet has been named "WidthTest" for easy reference & to ensure data is not overwritten. 
    'set WidthTest word wrapping off so that strings placed in there aren't wrapped 

    Application.ScreenUpdating = False 

    With [WidthTest] 
     .WrapText = False 
     .Value = MyText 
'autofit WidthTest 
     .Columns.AutoFit 
'get the width of the column 
     txtWidthPts = .Width 
     .ClearContents 
    End With 

End Function 

私は、このように作業ワークシートのセルに置くことで機能をテストした: = txtWidthPts(「Test123」)を 私はこの作業を持っているとき、私はワークシート関数としてのコードでそれをない使用することになります。

私の問題は、関数がエラーをスローしないことで、ライン上で実行を停止します。私は他のワークブックの内容/コードとの相互作用を確実にしないために、空のワークブックにコードと名前を配置している

.Value = MyText 

。 私は広範囲に検索し、さまざまな提案(DoEvents、Application.Update = Falseなど)を試してみました。 すべてのブレークポイントをクリアして、ワークブック&を再起動して閉じました。 Break on All Errorsに設定されたオプションでテストしました。 結果はありません。

私は何かが分かりにくいと思っていますが、それは私が今拍手しています。

すべてのご提案をお待ちしております。

+1

UDFを使用してExcel環境を変更することはできないため、代わりにこの機能をVBAからテストする必要があります。たとえば、 '?txtWidthPts(" Test123 ")'のようにイミディエイトウィンドウから実行するだけです。あるいは 'Sub Test()' 'Debug.Print txtWidthPts(" Test123 ")' 'End Sub'のようなダミーサブルーチンを持っています。 – YowE3K

答えて

0

だから、@ YowE3Kはお金の上にあった。元のコードでエラーを修正した後(上の修正コード)、これはvbaからうまく動作します。私は何かが明らかでないことを知っていた。

好奇心サブ疑問:この機能は必要に応じて機能し、実際には@ YowE3Kが観測したように、Excel環境は変更されません。しかし、返される結果はと表示され、Excel環境が変更されています。真剣にWTF。ただ理解したい。

もう一度YoWE3Kさんに感謝します。

+1

この関数は、UDFではなくVBAから呼び出されると、環境を変更することができます。しかし、UDFとして呼び出されると、 '.Value = MyText'行でクラッシュします(そして、UDFのクラッシュがただちに終了し、'#VALUE'エラーを返します)。私はまだUDF **が '.WrapText = False'のような**文を無視するのはなぜか、' .Value = MyText'のようなものは**クラッシュ**するようになっています。 – YowE3K

+0

さらなる説明をありがとう。私の好奇心のサブ疑問は全く正しくありませんでした。 vbaから実行すると、UDFは環境を変更します。 – pHred

関連する問題