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.