2014-12-03 79 views
0

我女兒的工作單位使用了一個帶有幾張工作表的2010 .xlsx工作簿。早些時候,我和我的妻子通過研究陣列和實施(在我們的結尾使用2007)進行協助。 陣列工作得很漂亮...直到宏被添加將.xlsx轉換爲.xlsm後,數組停止工作Excel 2007,

在稍後的時間,我被要求簡化設置數據在一個工作表中作爲報告使用兩個打印區域。有兩張簡單的字母數字數據。 (這些表單中沒有公式等,它們沒有鏈接到任何其他表單)。一張印有自己輸入的數據並且沒有打印。另一張紙僅保存相同數據的打印格式副本。她通過手動複製粘貼將一列長列中的4列數據移動到54行塊中的另一頁,以設置打印數據。這導致了一頁或兩頁打印數據,每個打印區域定義的頁面由3組四列54行的列組成。

從記錄宏開始,我做了同樣的事情,然後編輯VBA刪除不需要的操作。在宏運行正常後,我將.xlsx文件保存爲.xlsm。這些宏很好用。奇怪的是,現在另一個無關表中的陣列已停止工作。不知道爲什麼。我再次使用相同的結果重新創建文件。

注意:最後的版本(被認爲是最終版本)是通過將宏導出爲.bas文件並將其導入原始.xlsx文件的工作副本並保存爲.xlsm之前創建的。

我會很感激任何建議。我有一些想法可以嘗試,儘管我沒有任何信息表明這些可以提供幫助。一個是重新訪問每個數組,然後再次使用Ctrl + Shift + Enter。另一個是創建另一個版本,保留原來的.xlsx工作簿與添加宏之前的工作簿,並將宏模塊放入單獨的.xlsm工作簿中。

+0

能否請您發佈您的代碼。可能是「工作」是不是在代碼中明確提到,如果焦點移動到另一個表...好了,也不好。 – 2014-12-03 21:22:50

+1

是否有任何將計算設置爲手動的代碼?什麼「停止工作」看起來像是完全錯誤的結果,不計算輸入改變時的錯誤值? xlsm文件中的數組公式沒有問題。 – 2014-12-03 21:49:41

回答

0

感謝讓我重新重新思考的事情。雖然我沒有在其他工作表中工作,但調查發現有人刪除了一列,並將他們的工作表欄移到左邊。數組中的$ AA $ 1等單元格現在指向$ AA $ 1,但這不再是包含數據的列。初始測試表明這是問題,並插入一個空列導致他們的公式(數組)工作。我將其餘部分留給他們,並考慮解決這個問題。

雖然我無法控制工作簿的工作,但我至少可以建議某種鎖定保護措施,以提醒主要負責人在將來不做此類更改。我猜測某些VBA可能就位...在OnCurrent事件中觸發警告消息,如果有人取消保護?

+0

如果你可以創建一個合適的事件例程,將警告消息說些什麼? 「告訴道格拉斯,如果你改變任何事情,以免影響他的宏?」如果他們忘記了呢?如果在消息到達您之前運行宏,該怎麼辦?如果檢查失敗,添加一些檢查和中止更容易,更可靠,完全在您的控制之下。 – 2014-12-06 21:22:48

0

這不是一個答案,但建議太複雜,不能評論。

如果數組公式在列被刪除前就位,我希望Excel根據需要調整它們,如果可以的話。我假設你的宏運行時工作表不像你預期的那樣。

我被運行我的宏之前更換工作表的人燒燬了。那一次,這個變化非常微妙,而且看起來這個宏觀工作起來了。有一段時間他們才注意到數據被破壞了。

現在我的一個宏的第一階段是檢查關於工作表的假設,我不控制宏觀依賴的工作表。

如果有一種方法 - 不是檢查單個值等 - 進行確認一列只包含數值,比方說,我不知道。我會檢查invidual值,如果我有足夠的擔心,但你可以檢查這可能是適當的代理的數字格式。我一定會檢查列標題和表格標題的值。

我創建了一個新的工作簿和工作組的工作表「Sheet2的」到:

Image of test data for macro below

下面將產生以下輸出宏:

The number formats within Range E1:E16 are 0.00 
The number formats within Range E1:E17 are not all the same 
Check Values failure: Worksheet Sheet4 not found 
Check Values failure: Cell E2 has a value of [2] but I was expecting [5] 

你可以看到它是很容易檢查對於意外的格式,缺少工作表和不正確的單元格值。我爲自己開發了一套不適合分享的檢查功能,但您可以看到什麼是可能的。

Option Explicit 
Sub Test() 

    Dim ErrMsg As String 
    Dim Rng As Range 
    Dim NF As Variant 

    With Worksheets("Sheet2") 

    Set Rng = .Range("E1:E16") 
    NF = Rng.NumberFormat 
    If IsNull(NF) Then 
     Debug.Print "The number formats within Range " & _ 
        Replace(Rng.Address, "$", "") & " are not all the same" 
    Else 
     Debug.Print "The number formats within Range " & _ 
        Replace(Rng.Address, "$", "") & " are " & NF 
    End If 

    Set Rng = .Range("E1:E17") 
    NF = Rng.NumberFormat 
    If IsNull(NF) Then 
     Debug.Print "The number formats within Range " & _ 
        Replace(Rng.Address, "$", "") & " are not all the same" 
    Else 
     Debug.Print "The number formats within Range " & _ 
        Replace(Rng.Address, "$", "") & " are " & NF 
    End If 

    End With 

    Call CheckValues(ThisWorkbook.Name, "Sheet2", ErrMsg, _ 
        "C2", "Date", "C5", "Name", "C9", "Id") 

    If ErrMsg <> "" Then 
    Debug.Print "Check Values failure: " & ErrMsg 
    End If 

    Call CheckValues(ThisWorkbook.Name, "Sheet4", ErrMsg, _ 
        "C2", "Date", "C5", "Name", "C9", "Id") 

    If ErrMsg <> "" Then 
    Debug.Print "Check Values failure: " & ErrMsg 
    End If 

    Call CheckValues(ThisWorkbook.Name, "Sheet2", ErrMsg, _ 
        "E1", 1, "E2", 5) 

    If ErrMsg <> "" Then 
    Debug.Print "Check Values failure: " & ErrMsg 
    End If 


End Sub 
Sub CheckValues(ByVal WbkName As String, ByVal WshtName As String, _ 
       ByRef ErrMsg As String, ParamArray CellDtl() As Variant) 

    ' If the specified cells have the expected values, ErrMsg will be empty 
    ' on return. Otherwise ErrMsg will report the first cell with an 
    ' unexpected value. 

    ' WbkName The name of an open workbook. 
    ' WshtName The name of an worksheet within the workbook. 
    ' CellDtl Must contain an even number of values. The first value 
    '   of each paid must be a cell address such as "C1". The 
    '   second value must be the expected value of that cell. 
    '   for exampe ... "B1", Name", "C1", "Date", ... indicates 
    '   that cell B1 should have a value of "Name" and cell C1 
    '   should have a value of "Date". 

    Dim Found As Boolean 
    Dim InxCD As Long 
    Dim InxWbk As Long 
    Dim InxWsht As Long 

    Found = False 
    For InxWbk = 1 To Workbooks.Count 
    If WbkName = Workbooks(InxWbk).Name Then 
     Found = True 
     Exit For 
    End If 
    Next 

    If Not Found Then 
    ErrMsg = "Workbook " & WbkName & " is not open" 
    Exit Sub 
    End If 

    With Workbooks(WbkName) 
    Found = False 
    For InxWsht = 1 To .Worksheets.Count 
     If WshtName = .Worksheets(InxWsht).Name Then 
     Found = True 
     Exit For 
     End If 
    Next 

    If Not Found Then 
     ErrMsg = "Worksheet " & WshtName & " not found" 
     Exit Sub 
    End If 

    With .Worksheets(WshtName) 
     For InxCD = 0 To UBound(CellDtl) Step 2 
     If .Range(CellDtl(InxCD)).Value <> CellDtl(InxCD + 1) Then 
      ErrMsg = "Cell " & CellDtl(InxCD) & " has a value of [" & _ 
        .Range(CellDtl(InxCD)).Value & "] but I was expecting [" & _ 
        CellDtl(InxCD + 1) & "]" 
      Exit Sub 
     End If 
     Next 
    End With 

    End With 

    ' All value match 
    ErrMsg = "" 

End Sub