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 に示すようにコードを更新しました。