Utilizzando Index-Match in VBA


1

Sto cercando di inserire una funzione Index-Match nella mia macro VBA È simile al seguente:

Colonne ("C: C"). Forumla = "= INDICE ('[blabla.xlsm] Foglio1'! $ F $ 4: $ F $ 102, MATCH (B1, '[blabla.xlsm] Foglio1'! $ G $ 4: $ G $ 102,0))"

Tuttavia continuo a ricevere "Errore di run-time 438: l'oggetto non supporta questa proprietà o metodo"

Eventuali suggerimenti, suggerimenti sarebbero molto apprezzati.


Scuse - avrebbe dovuto aggiungere un po 'più di dettagli. Ho un file con i dati e ho inserito una colonna tra le 2 colonne di dati fornite con il file. Voglio posizionare la formula di corrispondenza dell'indice nella colonna appena creata, quindi copiare incollare la colonna di corrispondenza dell'indice e 1 delle 2 colonne iniziali in un foglio diverso. Da qui l'uso di "colonna ()".
— Riyer

1
Forumlanon è un membro della Rangeclasse. Funziona Formula?
— Mathieu Guindon,

.formula funziona per una funzione TEXT (), ma non per la funzione Index () che fa riferimento ad altri fogli
— Riyer

Presumo che sia un errore diverso - 1004 per caso? Prova a prendere la formula in una cella effettiva: se Excel non è in grado di valutarla, non puoi avere il codice VBA che tenta di forzare quella formula non valida in una cella.
— Mathieu Guindon,

Risposte:


2

Dichiarare una Rangevariabile e assegnarla ad Columns("C:C")es. Set myRange = ActiveSheet.Columns("C:C")(Se si trova in un modulo standard) o Set myRange = Me.Columns("C:C")(se si trova in un modulo del foglio di lavoro).

Dim myRange As Range
Set myRange = Columns("C:C")
myRange.Formula = "..."

Quindi, quando digiti il ​​punto myRange., otterrai un elenco a discesa che elenca i membri disponibili, le descrizioni dei parametri di quickinfo e la convalida in fase di compilazione. Il motivo per cui il tuo codice è stato autorizzato a compilare ed eseguire (indipendentemente dal fatto che Option Explicitsia specificato o meno) è perché Columnsrestituisce un Rangeoggetto, ma non ha alcun parametro: gli ("C:C")argomenti sono infatti forniti alla Range.[_Default]proprietà, che restituisce a Variant. Qualsiasi chiamata membro concatenata ad esso, pertanto, viene risolta solo in fase di esecuzione, ovvero qualsiasi errore di battitura non impedisce la compilazione e genera l'errore 438 in fase di esecuzione.

Dichiarando una Rangevariabile, stai "scrivendo il tipo" Variantin un Range, e da lì il compilatore è in grado di convalidare quali membri esistono e lanciare errori di compilazione dati un errore di battitura.


Leggenda. Ha funzionato. Saluti m8.
— Riyer

(@Riyer - Se ha funzionato e risolto il problema, puoi contrassegnarlo come Risposta facendo clic sul segno di spunta a sinistra del post. Ciò conferisce ulteriore credito all'autore e rimuove la tua domanda dalla coda senza risposta.)
— BruceWayne,

Fatto. Grazie Bruce. E grazie mille Mathieu.
— Riyer
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.