0

Excel 2003 を使用している同僚がいます。.xla アドインで、彼のためにいくつかのカスタム関数を作成しました。彼はアドイン内のカスタム関数のパスの問題に悩まされていたので、私がカスタム関数をワークブックに移動したところ、彼は必要に応じてそのワークブックのコピーを作成しました。

私がそれを彼に送ったとき、そしてそれ以来、私が彼に更新版を送るたびに、彼がワークブックを開くと、カスタム関数を使用するすべての数式が #Value エラーを返していることがわかりました。毎回、同じブックが Excel 2003 でも問題なく機能していました (私はそれ以降のバージョンの Excel も持っていますが、彼との作業には 2003 を使用しています)。

その後、彼が再計算しても何も起こりません。私は彼に等号の検索と置換を試みてもらいました。これは通常、影響を受ける数式を強制的に再計算させますが、効果はありませんでした。数式を再び機能させることができた唯一の方法は、手動でセルをアクティブにして (F2 キーを押すか、数式バーをクリックして)、Enter キーを押すことでした。SendKeys を使用して F2 を送信し、次に Enter を送信する VBA ループを試しましたが、一部のセルでは機能しましたが、すべてでは機能しませんでした。

しばらく彼と一緒に作業した後、いくつかの式が再び機能し、一部がまだ #Value を返している状態になったので、ワークブックを保存して私に送ってもらいました。同じ動作が得られた場合、すべての数式に #Value が表示されると予想されます。しかし、代わりに、彼のためにうまく機能していた数式が私にもうまく機能し、彼に #Value を返していた数式が私にも同じことをしていることがわかりました。したがって、私が送信したファイルを開いたときに正常に動作することから #Value を返すように変更することは、同じバージョンの Excel では起こっていないようです。

なぜこれが起こっているのでしょうか?トラブルシューティングの提案はありますか?

アップデート:

影響を受けるカスタム関数の例を提供するよう求められました。「GetCompanyName」の 1 つを次に示します。

Option Explicit

Public Const APP_NAME As String = "Download Financials"

'TABLE NAME:
Public Const TABLE_INCOME_STATEMENT_ANNUAL As String = "_TABLE_INCOME_STATEMENT_ANNUAL_"
Public Const TABLE_BALANCE_SHEET_ANNUAL As String = "_TABLE_BALANCE_SHEET_ANNUAL_"

'LINE ITEM NAME:
Public Const ROW_TOTAL_REVENUE As String = "Total Revenue"
Public Const ROW_GROSS_PROFIT As String = "Gross Profit"
Public Const ROW_OPERATING_INCOME As String = "Operating Income"

'SPECIAL:
Public Const EXCHANGE_SYMBOL As String = "_EXCHANGE_SYMBOL_"
Public Const COMPANY_NAME As String = "_COMPANY_NAME_"
Public Const COMPANY_DESC_SHORT As String = "_COMPANY_DESCRIPTION_SHORT_"
    Public Const DESC_SHORT_NA As String = "Short Company Description is not available."
Public Const COMPANY_DESC_LONG As String = "_COMPANY_DESCRIPTION_LONG_"
    Public Const DESC_LONG_NA As String = "Long Company Description is not available."


Public Const DATE_ADD_INTERVAL_MINUTE As String = "n" 'm is month.
Public Const DATE_ADD_INTERVAL_SECOND As String = "s"

Public Const WEB_OUTPUT_FILE_NAME As String = "Output"

Public Const COLOR_SOFT_YELLOW As Long = 10092543
Public Const COLOR_DARK_RED As Long = 128

Public Const DOWNLOAD_STATUS_SUCCESS As String = "Success"
Public Const DOWNLOAD_STATUS_FAILURE As String = "Failure"


'shDownloadIndex (worksheet's codename):
Public Const COL_DOWNLOADINDEX_URL As Long = 1
Public Const COL_DOWNLOADINDEX_SHEETNAME As Long = 2
Public Const COL_DOWNLOADINDEX_TIME As Long = 3
Public iRowDownloadIndex As Long
Public rgDownloadIndexCell As Range, strDownloadIndexURL As String

Public wbCurrent As Workbook, shCurrent As Worksheet
Public shDownloadIndex As Worksheet

Public wbWeb As Workbook, shWeb As Worksheet
Public rgColA As Range
Public rgFind As Range
Public rgHeaderIncomeStatement As Range, rgRowHeaderIncomeStatement As Range
Public rgHeaderBalanceSheet As Range, rgRowHeaderBalanceSheet As Range

Public rgExchangeSymbol As Range, rgCompanyName As Range
Public rgDesc As Range, strDesc As String
Public iPosStart As Long, iPosEnd As Long, iPosTmp As Long, iPosCounter As Long, iLen As Long

Public rgTmpRow As Range, shTmpHeader As Range
Public iTmpRow As Long

Public dateLastCall As Date
Public bDownloadInProgress As Boolean

Public bCancelDownload As Boolean    

Public Const COL_DOWNLOADINDEX_URL As Long = 1
    Public Const COL_DOWNLOADINDEX_SHEETNAME As Long = 2
    Public Const COMPANY_NAME As String = "_COMPANY_NAME_"

    Public Function GetCompanyName(full_url As String) As Variant

        Set wbCurrent = ActiveWorkbook: Set shCurrent = ActiveSheet
        Set shDownloadIndex = SetDownloadIndexSheet(shDownloadIndex, wbCurrent, shCurrent)

        Set rgDownloadIndexCell = shDownloadIndex.Columns(COL_DOWNLOADINDEX_URL).Find(What:=full_url, LookIn:=xlValues, LookAt:=xlPart, SearchDirection:=xlNext, MatchCase:=False)
        strDownloadIndexURL = shDownloadIndex.Cells(rgDownloadIndexCell.Row, COL_DOWNLOADINDEX_SHEETNAME).Value
        Set shWeb = wbCurrent.Worksheets(strDownloadIndexURL)
        Set rgColA = shWeb.Columns(1).EntireColumn
        Set rgFind = rgColA.Find(COMPANY_NAME, rgColA.Cells(1), xlValues, xlWhole, , xlNext, False)
        Set rgCompanyName = rgFind.End(xlDown)

        GetCompanyName = rgCompanyName.Value

    End Function


    Public Function SetDownloadIndexSheet(index_sheet As Worksheet, work_book As Workbook, after_sheet As Worksheet) As Worksheet
        Dim shTmp As Worksheet, shDownloadIndex As Worksheet
        Dim shActiveSheet As Worksheet
        Dim bIndexSheetIsBad As Boolean

        On Error GoTo CheckingIndexSheet

        bIndexSheetIsBad = False 'init.
        If Not index_sheet Is Nothing Then
            If Not bIndexSheetIsBad Then
                If index_sheet.Name = "DownloadIndex" Then
                    If Not bIndexSheetIsBad Then
                        Set SetDownloadIndexSheet = index_sheet
                        Exit Function
                    End If
                End If
            End If
        End If

        On Error GoTo GenErr

        For Each shTmp In work_book.Worksheets
            If shTmp.Name = "DownloadIndex" Then
                Set shDownloadIndex = shTmp
                Exit For
            End If
        Next shTmp
        If shDownloadIndex Is Nothing Then
            Set shActiveSheet = ActiveSheet
            Set shDownloadIndex = work_book.Worksheets.Add(after:=after_sheet)
            shDownloadIndex.Name = "DownloadIndex"
            shDownloadIndex.Visible = xlSheetVisible
            shActiveSheet.Activate
        End If
        Set SetDownloadIndexSheet = shDownloadIndex

        Exit Function
    CheckingIndexSheet:
        If False Then
            Resume
        End If
        bIndexSheetIsBad = True
        Resume Next

    GenErr:
        If False Then
            Resume
        End If

    End Function

更新 2:

ここで職場では Excel 2003 を持っていません。代わりに、雇用主は Excel 2007 だけを提供してくれました。彼の同じブックが Excel 2007 で問題なく開くことがわかりました。すべての機能が正常に動作します。昨夜家で彼と電話をしたが、遅かったし、時間に追われていたので、2007年、2010年、2013年をテストしなかった.

しかし、彼はリボンが大嫌いなので、まだ Excel 2003 を使用しています。この問題を回避するために Excel 2003 でできることについて何かアイデアはありますか?

更新 3:

すべての変数が宣言されていることを Ron に示すようにコードを更新しました。

4

1 に答える 1

0

私は 2003 を持っていないので (2007 のみ)、これがうまくいくことを願っています。

できることは、数式バーで使用される各関数の上部で「Application.Volatile」を使用することです。これにより、ユーザー定義関数が揮発性としてマークされます。ワークシートのいずれかのセルで計算が行われるたびに、揮発性関数を再計算する必要があります。不揮発性関数は、入力変数が変更された場合にのみ再計算されます。

public Function xx () as variant
  Application.Volatile(True)
  '
  'Your code
  '  
end function
于 2015-05-03T12:32:53.303 に答える