2014-11-23 5 views
6

Problema - Sono presenti più di 8202 caratteri in una cella, diciamo Intervallo ("A1").Errore durante la copia di più di 8202 caratteri da una cella all'altra

Ora desidero copiare il contenuto della cella (A1) nella cella (A2) utilizzando VBA. Sto usando sotto il codice

Sheets("XYZ").Range("A2") = Sheets("XYZ").Range("A1") 

Dopo l'esecuzione del Codice. Dà "Application Defined Or Object Defined Error !!"

Si prega di aiutare/aiutare con i commenti degli esperti.

Osservazione - Se riduco la lunghezza della cella "A1" a 8202 o meno, il codice funziona!

Sono confuso. Pls assist.

+0

Come da riferimento per Excel 2010: "Numero totale di caratteri che una cella può contenere: 32.767 caratteri" (http://office.microsoft.com/en-us/excel-help/excel-specifications-and-limits-HP010342495.aspx) Quale versione di Excel stai usando?Inoltre, controlla la presenza di un carattere speciale nella cella. Cordiali saluti, –

+0

@AlexBell - Sto usando solo Excel 2010. Non so perché mi limita a solo 8202 caratteri. –

+0

Come ti ho detto, controlla i caratteri speciali in quella posizione. Inoltre, per cominciare: costruisci una stringa di prova di soli alfanumerici più lunghi di 8202 caratteri e vedi come funziona. Cordiali saluti, –

risposta

5

modificare il codice per

Sheets("XYZ").Range("A2") = Sheets("XYZ").Range("A1").Value 

e funzionerà.

Non proprio sicuro perché tuttavia, come .Value è la proprietà predefinita di un intervallo.

+0

L'errore più probabile è stato causato da un cursore nella cella di origine (modalità di modifica). Altrimenti, funziona bene senza aggiungere esplicitamente .value (è una proprietà di default dell'oggetto range come menzionato sopra da Chris Neilsen). Cordiali saluti, –

+1

Scusa @alex ma ti sbagli qui. Sia Portland che io possiamo replicare il problema. Se funziona per te, pubblica i dettagli della configurazione e del codice di prova. Il mio è Excel 2010, 32 bit, su Windows 7 a 64 bit. –

+0

Grazie @chrisneilsen !! Ha funzionato per me –

2

sono stato in grado di duplicare il vostro errore con il seguente:

Sub Test8202Copy() 
    Dim wks As Worksheet 
    Set wks = Worksheets("Sheet1") 
    Dim x As String 

    For i = 0 To 8202 
     x = x + "a" 
    Next i 

    wks.Range("A1").Value = x 
    wks.Range("A2") = wks.Range("A1") 
End Sub 

sono stato in grado di risolvere l'errore aggiungendo .value alla copia.

Sub Test8202Copy() 
    Dim wks As Worksheet 
    Set wks = Worksheets("Sheet1") 
    Dim x As String 

    For i = 0 To 8202 
     x = x + "a" 
    Next i 

    wks.Range("A1").Value = x 
    wks.Range("A2").Value = wks.Range("A1").Value 
End Sub 

Utilizzando una variabile intermedia senza l'uso di .Value sembra funzionare:

Dim y As Variant 
y = wks.Range("A1") 
wks.Range("A2") = y 

mia ipotesi finora è che 8202 superano il limite di caratteri del tipo di dati utilizzato quando si don' t definire .Value. La lunghezza limite nella cella è 32.767 (MS Excel 2010) che è quasi 4x il valore 8201 che cancella.

+0

Snap. Qualche idea su _why_? –

+0

@chrisneilsen Dai un'occhiata alla mia modifica, abbastanza interessante che una variabile intermedia risolva anche questo ... hmmm Morde ancora questo. –

+0

Sì, @PortlandRunner, hai ragione. Ma se si usa Set y = wks.Range ("A1") fallirà, come nel mio esempio con l'assegnazione dell'oggetto Range. Sembra l'espressione originale (Sheets ("XYZ"). Range ("A2") = Sheets ("XYZ"). Range ("A1")) assegna Oggetti intervallo invece di proprietà .value. –

1

@ Chris Neilsen fornito la soluzione più pratica ed elegante per il problema (il suo frammento di codice seguente):

Sheets("XYZ").Range("A2") = Sheets("XYZ").Range("A1").Value 

Al fine di indagare e comprendere la possibile causa di questo strano comportamento (può essere un bug) dell'oggetto Range, ho postato commenti di coppia, che riassumiamo di seguito:

C'è una differenza concettuale tra l'espressione originale (vedi sotto):

Sheets("XYZ").Range("A2") = Sheets("XYZ").Range("A1") 

e soluzione proposta da @Chris Neilsen, vale a dire: espressione originale viene implicitamente assegnando var oggetto Range (essenzialmente, un puntatore) a un altro oggetto Range, come mostrato nel seguente frammento di codice con assegnazione esplicita:

Set rng = Sheets("XYZ").Range("A1") 
Sheets("XYZ").Range("A2") = rng 

mentre la soluzione proposta passa esplicitamente la proprietà value. Tuttavia, il motivo per cui l'assegnazione di un oggetto Range non è riuscita per un valore con string.Lunghezza> 8202 non è al momento chiaro (potrebbe essere causato da alcune sfumature interne dell'implementazione dell'oggetto Range di Excel).

Grazie mille per aver postato questa interessante domanda e una discussione fruttuosa. saluti,

1

Questo limite (vedi sotto ri ) è coperto in questo MSDN article anche interessante implica una matrice VBA è invoved

separatamente a https://stackoverflow.com/a/13665363/641067 cative stringhe maniglia matrice superiori a 911 caratteri, mentre l'articolo di seguito i riferimenti 1823 carattere

Sintomi

Quando si esegue una macro Microsoft Visual Basic Applications Edition (VBA) per trasferire i dati da un array VBA che contiene stringhe di dati a un intervallo di celle in un foglio di lavoro Microsoft Excel, i dati potrebbero essere troncati (tagliati).

Nota In Microsoft Office Excel 2003 e nelle versioni successive di Excel, è possibile che venga visualizzato il seguente messaggio di errore quando si esegue la macro VBA in Visual Basic Editor: Run-time error '1004'

CAUSA

Questo problema può verificarsi in presenza di una delle seguenti condizioni:

  • In Excel 2007, il L'array VBA è più lungo di di 8.203 caratteri di lunghezza.
  • In Excel 2003 e nelle versioni precedenti di Excel, la matrice VBA è più lungo di 1823 caratteri di lunghezza
Problemi correlati