2016-02-12 16 views
5

Ho creato una UDF che funziona su un singolo foglio. Il problema si verifica con più fogli. Se ho la formula su più fogli, e se la (ri) carica su un foglio, cambia anche l'output in TUTTI gli altri fogli.UBA VBA modifica i valori su TUTTI i fogli. Come limitare a uno?

Perché succede? Non sto usando ActiveWorksheet o Active Cell o simili.

Function customreturn(security As Range, datacheck As Range) As Variant 

    Dim row_num As Integer 
    Dim row_num2 As Integer 
    Dim price1 As Double 
    Dim price2 As Double 
    Dim perfo As Double 
    Dim blank_end As Boolean 

    row_num = security.Row 
    col_num = security.Column 
    row_num2 = row_num + 1 
    col_num2 = datacheck.Column 

    If WorksheetFunction.IsError(datacheck.Value) = True Then 
     customreturn = "No data" 
    Else 
     price1 = Cells(row_num, col_num).Value 

     Do While WorksheetFunction.IsError(Cells(row_num2, col_num2).Value) = True 
      row_num2 = row_num2 + 1 
     Loop 

     price2 = Cells(row_num2, col_num).Value 

     perfo = price1/price2 - 1 

     customreturn = perfo 
    End If 
End Function 
+2

Ricarica la formula, il che significa che ricalcola? Oppure ricalcola e utilizza le stesse informazioni su tutti i fogli, invece di utilizzare i dati sul foglio in cui si trova la formula? (...Ha senso?). Potrebbe avere qualcosa a che fare con [Volatility] (http://www.mrexcel.com/forum/excel-questions/271165-udf-volatile-vs-not.html) – BruceWayne

+0

1) Se carico la formula in un foglio manualmente 2) Utilizza lo stesso valore su tutti gli altri fogli - sì – sandboxj

+0

Inoltre, prova ad aggiungere una variabile del foglio di lavoro ('Dim ws come foglio di lavoro',' Imposta ws = Fogli (security.parent.name) ', quindi aggiungi' ws .' prima di tutti gli usi di 'Cells()'. Ciò assicurerà che i dati provengano dal foglio 'security' è acceso. – BruceWayne

risposta

6

Non v'è alcun foglio di lavoro genitore specificato per una delle tre volte si utilizza il Range.Cells property in modo che il foglio di lavoro genitore è stabilizzato al ActiveSheet property. Questo può essere corretto con un With ... End With statement che fornisce un riferimento al foglio di lavoro su uno dei parametri dell'intervallo Range.Parent property.

Function customreturn(security As Range, datacheck As Range) As Variant 
    Dim row_num As Long, row_num2 As Long, col_num As Long, col_num2 As Long 
    Dim price1 As Double, price2 As Double, perfo As Double 
    Dim blank_end As Boolean 

    row_num = security.Row 
    col_num = security.Column 
    row_num2 = row_num + 1 
    col_num2 = datacheck.Column 

    With security.Parent 
     If IsError(datacheck) Then 
      customreturn = "No data" 
     Else 
      price1 = .Cells(row_num, col_num).Value 

      Do While IsError(.Cells(row_num2, col_num2)) 
       row_num2 = row_num2 + 1 
      Loop 

      price2 = .Cells(row_num2, col_num).Value 

      perfo = price1/price2 - 1 

      customreturn = perfo 
     End If 
    End With 
End Function 

All'interno del With ... End With, tutta la Cells sono riferimenti come .Cells per dimostrare che il foglio di lavoro genitore è quello di cui al con ... End With.

Non è necessario confrontare in modo esplicito il foglio di lavoro ISERROR o VBA IsError function a True. Sa già se è vero o falso.

È stato rilevato (grazie BruceWayne) che si sono avute due variabili non dichiarate, colonna e colonna numero2. Questo può essere evitato aggiungendo Option Explicit ¹ all'inizio di ogni foglio di codice nell'area delle dichiarazioni.


¹ Impostazione Richiedi dichiarazione di variabili all'interno Strumenti del VBE ► pagina delle proprietà Opzioni ► Editor metterà la dichiarazione Option Explicit nella parte superiore di ogni foglio di codice appena creato. Ciò eviterà errori di codifica stupidi come errori ortografici e influirà sull'uso del tipo di variabile corretto nella dichiarazione delle variabili. Le variabili create al volo senza dichiarazione sono tutte della variante/tipo di oggetto. L'utilizzo dell'opzione Explicit è ampiamente considerato "best practice".

+1

Quindi mi sono imbattuto in qualcosa quando suggerivo di rendere esplicito il foglio? Yay! Bello sapere che io ' m sulla giusta strada in UDF (sto ancora imparando). Bella spiegazione! (Per fortuna ci sono alcune variabili non dichiarate, 'col_num' e' col_num2'). Suggerirei anche di aggiungere 'Option Explicit' in qualsiasi momento in VBA – BruceWayne

+1

Sì, sembra che il problema sia stato il migliore, a questo punto, l'OP può confermare. a-giorni, ogni volta che vedo campane d'allarme 'Cells' e non' .Cells' si spengono nella mia testa. – Jeeped

+1

... e grazie per aver notato le voci non dichiarate; Ho modificato la mia risposta per riflettere questo. – Jeeped

Problemi correlati