Le matrici hanno smesso di funzionare dopo la conversione di .xlsx in .xlsm Excel 2007

Il posto di lavoro di mia figlia utilizza una cartella di lavoro 2010 .xlsx con parecchi fogli. In precedenza mia moglie ed io abbiamo aiutato a ricercare gli arrays e implementarli (usando 2007 alla fine) . Gli arrays hanno funzionato splendidamente … fino a quando … sono stati aggiunti macro .

A molto più tardi, mi è stato chiesto di rendere più semplice la configuration dei dati in un foglio che funziona come rapporto utilizzando due aree di printing. Ci sono due fogli di dati alfanumbersci semplici. (Nessuna formula, ecc in uno di questi fogli e non sono collegati ad altri fogli). Un foglio contiene i dati mentre è entrata e non viene printingta. L'altra scheda contiene solo la copia printingta degli stessi dati. Aveva spostato le 4 colonne di dati dalle colonne lunghe di un foglio impostate sull'altra scheda in blocchi di 54 righe tramite copia-incolla manuale per impostare i dati da printingre. Ciò ha determinato una o due pagine di dati di printing, ciascuna pagina definita dall'area di printing in 3 set di quattro colonne a 54 righe.

A partire dalla macro record, ho fatto la stessa cosa che aveva fatto, poi ho modificato la VBA per eliminare le azioni inutili. Dopo che le macro funzionavano senza problemi, ho salvato il file .xlsx come .xlsm. I macro funzionano ottimamente. Abbastanza stranamente, ora gli arrays di un altro foglio non correlato hanno smesso di funzionare . Non c'è idea di perché. Ho ricreato il file di nuovo con lo stesso risultato.

Nota: L'ultima versione (pensata per essere definita) è stata creata esportndo le macro come file .bas e importndola in una copia di lavoro del file originale .xlsx prima di salvare come .xlsm.

Mi piacerebbe avere dei suggerimenti. Ho delle idee di coppia per cercare, anche se non ho informazioni che suggeriscano che ciò avrebbe aiutato. Uno è quello di rivedere each arrays e utilizzare nuovamente Ctrl + Shift + Enter su ciascuna di esse. L'altro è creare un'altra versione, mantenendo la cartella di lavoro originale .xlsx come era prima delle macro aggiunte e mettere il module di macro in una cartella di lavoro separata .xlsm.

Solutions Collecting From Web of "Le matrici hanno smesso di funzionare dopo la conversione di .xlsx in .xlsm Excel 2007"

Grazie per averci fatto ricompensare le cose. Anche se non lavoravo negli altri fogli, la ricerca ha scoperto che qualcuno aveva cancellato una colonna, spostando le colonne di foglio a sinistra. Le celle come $ AA $ 1 negli arrays hanno ora puntato a $ AA $ 1, ma non era più la colonna con i dati previsti. Test iniziali indica che questo era il problema e l'inserimento di una colonna vuota ha causato le loro formule di foglio (arrays). Lascio il resto su di loro e considero questo problema risolto.

Anche se non ho il controllo su ciò che è fatto con la cartella di lavoro, posso alless consigliare una sorta di protezione di block per ricordare alla persona principale responsabile di non fare tali cambiamenti in futuro. Sto indovinando che un certo VBA potrebbe essere presente … in un evento OnCurrent per triggersre un messaggio di avviso se qualcuno protegge?

Questa non è una risposta ma un consiglio troppo complicato per un commento.

Se le formule di matrix erano in atto prima che la colonna venisse eliminata, mi aspetto che Excel li aggiusta se necessario se posso. Sto supponendo che il foglio di lavoro non fosse come previsto quando la tua macro è stata eseguita.

Sono stato bruciato da qualcuno che cambia un foglio di lavoro prima di eseguire una mia macro. In quell'occasione, il cambiamento era abbastanza sottile e sembrava che la macro funzionasse. Qualche volta prima avevano notato che i dati erano corrotti.

Ora la prima fase di una mia macro è controllare le ipotesi relative a fogli di lavoro che non controlli ma su cui dipende la macro.

Se esiste un modo – diverso dal controllo dei singoli valori – per confermare che una colonna contiene solo valori numbersci, ad esempio, non lo conosco. Controllerò i valori invidental se sono abbastanza preoccupato, ma puoi controllare il formato del numero che può essere un proxy adeguato. Cercherò certamente di controllare i valori delle intestazioni di colonna e delle intestazioni di tabella.

Ho creato una nuova cartella di lavoro e ho impostato il foglio di lavoro "Sheet2" per:

Immagine dei dati di prova per la macro sotto

La macro seguente ha prodotto l'output seguente:

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] 

Puoi vedere che è abbastanza facile verificare la formattazione inaspettata, i fogli di lavoro mancanti e i valori di cella non corretti. Ho sviluppato una serie di funzioni di controllo per me che non sono adatte per la condivisione, ma puoi vedere ciò che è ansible.

 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