2010-04-16 15 views
12

Sembra che Visual Basic non possa fare riferimento ai fogli in base ai nomi dei fogli modificati dall'utente. Le schede del foglio di lavoro possono avere i loro nomi modificati, ma sembra che Visual Basic pensi ancora ai nomi del foglio di lavoro come Foglio1, ecc., Nonostante la scheda della cartella di lavoro sia stata modificata in qualcosa di utile.Nomi dei separatori di Excel e nomi dei fogli di Visual Basic

ho questo:

TABname = rng.Worksheet.Name ' Excel sheet TAB name, not VSB Sheetx name. 

ma vorrei usare i nomi dei fogli di routine di Visual Basic. La cosa migliore che ho trovato fino ad ora è selezionare Seleziona la scheda Foglio di lavoro rispetto ai nomi di Visual Basic, che non rendono la mia giornata. Visual Basic deve conoscere i nomi Sheet1, Sheet2, ecc. Come posso ottenere questi associati ai nomi delle schede di Excel in modo che non debba mantenere una tabella di ricerca che cambia con ogni nuova scheda di fogli o fogli rinominando? Grazie in anticipo per le risposte.

+1

Non ho mai riscontrato una situazione in cui un nome di foglio viene modificato ma VB non riesce a vedere la modifica. Puoi mostrare il tuo codice rilevante? –

risposta

16

nel modello a oggetti di Excel un foglio di lavoro dispone di 2 diverse proprietà name:

Worksheet.Name
Worksheet.CodeName

la proprietà Name è di lettura/scrittura e contiene il nome che appare sul la scheda del foglio. E 'facile e VBA mutevole

la proprietà CodeName è di sola lettura

È possibile fare riferimento a un foglio particolare per quanto fogli di lavoro ("Fred"). Range ("A1") dove Fred è la proprietà .Name oppure come Sheet1.Range ("A1") dove Foglio1 è il nome in codice del foglio di lavoro.

+0

Sì, questo è quello che stavo cercando, grazie! – SteveNeedsSheetNames

+0

Ora voglio avere una funzione di base visiva con un output ParamArray e voglio che quell'output sia disponibile per un'altra funzione, senza doverlo mettere su un foglio di lavoro solo per prenderlo in quella seconda funzione. C'è un modo per trasferire gli array tra le funzioni in Visual Basic? Grazie in anticipo per la tua risposta. – SteveNeedsSheetNames

3

Dovresti poter fare riferimento ai fogli con il nome fornito dall'utente. Sei sicuro di fare riferimento alla cartella di lavoro corretta? Se hai più di una cartella di lavoro aperta nel momento in cui fai riferimento a un foglio, questo potrebbe sicuramente causare il problema.

Se questo è il problema, utilizzare ActiveWorkbook (la cartella di lavoro attualmente attiva) o ThisWorkbook (la cartella di lavoro che contiene la macro) dovrebbe risolverlo.

Ad esempio,

Set someSheet = ActiveWorkbook.Sheets("Custom Sheet") 
0

Ci sono (almeno) due modi diversi per ottenere la Worksheet oggetto

  • tramite le collezioni Sheets o Worksheets come riferito da DaNm
  • da qualificato nomi di oggetti

Quando viene creata una nuova cartella di lavoro con tre fogli di lavoro, esistono quattro oggetti a cui è possibile accedere tramite nomi non qualificati: ThisWorkbook; Sheet1; Sheet2; Sheet3. Questo consente di scrivere cose come questa:

Sheet1.Range("A1").Value = "foo" 

Anche se questo può sembrare una scorciatoia utile, il problema nasce quando i fogli di lavoro vengono rinominati. Il nome dell'oggetto non qualificato rimane come Sheet1 anche se il foglio di lavoro viene rinominato in qualcosa di completamente diverso.

V'è una certa logica a questo perché:

  • nomi del foglio di lavoro non sono conformi alle stesse regole come nomi di variabili
  • si potrebbe mascherare accidentalmente una variabile esistente

Per esempio (testato in Excel 2003), creare un nuovo Workbook con tre fogli di lavoro. Crea due moduli.In un modulo dichiarare questo:

Public Sheet4 As Integer 

Nell'altra put modulo:

Sub main() 

Sheet4 = 4 

MsgBox Sheet4 

End Sub 

Eseguire questa e la finestra di messaggio dovrebbe essere visualizzato correttamente.

Ora aggiungere un quarto foglio di lavoro alla cartella di lavoro che creerà un oggetto Sheet4. Prova a eseguire nuovamente main e questa volta visualizzerai un errore "L'oggetto non supporta questa proprietà o il metodo"

0

Ho dovuto ricorrere a questo, ma questo ha problemi di manutenzione.

Function sheet_match(rng As Range) As String ' Converts Excel TAB names to the required VSB Sheetx names. 
    TABname = rng.Worksheet.Name    ' Excel sheet TAB name, not VSB Sheetx name. Thanks, Bill Gates. 
' Next, match this Excel sheet TAB name to the VSB Sheetx name: 
    Select Case TABname 'sheet_match 
     Case Is = "Sheet1": sheet_match = "Sheet1" ' You supply these relationships 
     Case Is = "Sheet2": sheet_match = "Sheet2" 
     Case Is = "TABnamed": sheet_match = "Sheet3" 'Re-named TAB 
     Case Is = "Sheet4": sheet_match = "Sheet4" 
     Case Is = "Sheet5": sheet_match = "Sheet5" 
     Case Is = "Sheet6": sheet_match = "Sheet6" 
     Case Is = "Sheet7": sheet_match = "Sheet7" 
     Case Is = "Sheet8": sheet_match = "Sheet8" 
    End Select 
End Function 
1

In realtà "Foglio1" nome oggetto/codice può essere modificato. In VBA, fare clic su Foglio1 nell'elenco Oggetti di Excel. Nella finestra delle proprietà, puoi cambiare Sheet1 per dire rng.

Quindi è possibile fare riferimento a rng come oggetto globale senza dover prima creare una variabile. Quindi debug.print rng.name funziona bene. Niente più fogli di lavoro ("rng"). Name.

A differenza della scheda, il nome dell'oggetto ha le stesse restrizioni di altre variabili (ad esempio, senza spazi).

0

Utilizzando il nome in codice scheda è stata la risposta che mi serviva anche per fermare una serie di macro cadere - la risposta di ccampj sopra specchi this solution (con schermo foto)

1

Questa una soluzione molto semplice (forse mi manca la piena punto della domanda). ActiveSheet.Name restituirà la stringa del nome della scheda corrente (e rifletterà eventuali modifiche future dell'utente). Ho appena chiamato il foglio attivo, impostare la variabile e quindi utilizzarla come oggetto dei fogli di lavoro. Qui sto recuperando i dati da una tabella per impostare un report per una divisione. Questa macro funzionerà su qualsiasi foglio della mia cartella di lavoro che è formattato per lo stesso filtro (criteri e copytorange) - ogni divisione ottiene il proprio foglio e può modificare i criteri e aggiornare utilizzando questa singola macro.

Dim currRPT As String 
ActiveSheet.Select 
currRPT = (ActiveSheet.Name) 
Range("A6").Select 
Selection.RemoveSubtotal 
Selection.AutoFilter 
Range("PipeData").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range _ 
    ("C1:D2"), CopyToRange:=Range("A6:L9"), Unique:=True 
Worksheets(currRPT).AutoFilter.Sort.SortFields.Clear 
Worksheets(currRPT).AutoFilter.Sort.SortFields.Add Key:= _ 
    Range("C7"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ 
    xlSortNormal 
+0

Il problema dell'elencazione Proc Consente di impostare Get Subs Func è stato con me per alcuni anni in cui il nome del codice del nome del foglio Nome modulo era un disastro. Questo risolve il problema. Molto apprezzato è stato il tuo codice Harry S –

3

Questo cambierà i nomi di tutti gli oggetti del foglio di lavoro (dal punto di vista l'editor VBA) per corrispondere a quello dei loro nomi dei fogli (dal punto di vista di Excel):

Sub ZZ_Reset_Sheet_CodeNames() 
'Changes the internal object name (codename) of each sheet to it's conventional name (based on it's sheet name) 

    Dim varItem As Variant 

    For Each varItem In ThisWorkbook.VBProject.VBComponents 
     'Type 100 is a worksheet 
     If varItem.Type = 100 And varItem.Name <> "ThisWorkbook" Then 
      varItem.Name = varItem.Properties("Name").Value 
     End If 
    Next 
End Sub 

è importante si noti che il nome dell'oggetto (nome in codice) "(Nome)" viene sovrascritto dal nome della proprietà "Nome" e quindi deve essere referenziato come una proprietà secondaria.

+0

"Accesso programmatico al progetto di Visual Basic non è affidabile" - abilita le impostazioni macro http://stackoverflow.com/a/25638419/ – user423430

+0

.Proprietà ("Nome"). Il valore era ESATTAMENTE quello che ero cercando, grazie! – baldmosher

+0

Il problema dell'elenco Proc Consente di impostare Get Subs Func è stato con me per alcuni anni in cui il nome del codice del nome del foglio Nome modulo era un disastro. Questo lo risolve. Molto apprezzato è stato il tuo codice Harry S –