Mi serve un aiuto su una macro VBA Excel?

Sto imparando a usare VBA Excel e mi sto esercitando un po'..

Ho fatto una piccola macro per fare dei piccoli calcoli, ma al comando di trascina cella mi da errore, mi aiutate a capire il perchè?

Sub Prova_Interagire2_Fogli()

Dim Pippo As Integer, y As Integer

Pippo = 3

For y = 2 To 5

If Range("C" & y) > 0 Then

Range("C" & y).Copy Foglio2.Range("A" & Pippo)

Range("A" & y).Copy Foglio2.Range("B" & Pippo)

Range("D" & y).Copy Foglio2.Range("c" & Pippo)

Foglio2.Range("D" & Pippo).Value = Range("C" & y) * Range("D" & y).Value

Foglio2.Range("D" & Pippo).Font.Bold = True

Foglio2.Range("D" & Pippo).Font.ColorIndex = 3

Pippo = Pippo + 1

End If

Next y

Foglio2.Range("E2").Value = "CELLA VALORI"

Foglio2.Range("A2:E2").Font.Bold = True

Foglio2.Range("D3:D4").Select

Selection.Copy

Foglio2.Range("E3:E4").Select

'Il comando riportato quì di sotto serve per copiare "Copia valori"

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _

:=False, Transpose:=False

'Fine comando "Copia valori"

For X = 3 To 5

Foglio2.Range("F3") = "=D3*E3"

Foglio2.Range("F3").Select

Selection.AutoFill Destination:=Range("F3:F4"), Type:=xlFillDefault

Range("F3:F4").Select

Next X

End Sub

1 risposta

Classificazione
  • 8 anni fa
    Risposta preferita

    TI manca la selezione del Foglio2: prima di selezionare un Range che si trova su un foglio diverso da quello dove lanci la macro, devi necessariamente selezionare il foglio stesso.

    Altrimenti ti devi riferire al Range senza l'utilizzo del Select, che è la soluzione migliore.

    Non ho ben capito l'ultima parte cosa intendi fare.

    La tua routine corretta diventerebbe:

    Sub Prova_Interagire2_Fogli()

    Dim Pippo As Integer, y As Integer, x As Integer

    Pippo = 3

    For y = 2 To 5

    If Range("C" & y) > 0 Then

    Range("C" & y).Copy Foglio2.Range("A" & Pippo)

    Range("A" & y).Copy Foglio2.Range("B" & Pippo)

    Range("D" & y).Copy Foglio2.Range("c" & Pippo)

    Foglio2.Range("D" & Pippo).Value = Range("C" & y) * Range("D" & y).Value

    Foglio2.Range("D" & Pippo).Font.Bold = True

    Foglio2.Range("D" & Pippo).Font.ColorIndex = 3

    Pippo = Pippo + 1

    End If

    Next y

    Foglio2.Range("E2").Value = "CELLA VALORI"

    Foglio2.Range("A2:E2").Font.Bold = True

    'prima di selezionare il Range devi selezionare il foglio

    'perché al momento ti trovi su un altro

    Foglio2.Select

    Foglio2.Range("D3:D4").Select

    Selection.Copy

    Foglio2.Range("E3:E4").Select

    'Il comando riportato quì di sotto serve per copiare "Copia valori"

    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _

    :=False, Transpose:=False

    'Fine comando "Copia valori"

    For x = 3 To 5

    Foglio2.Range("F3") = "=D3*E3"

    Foglio2.Range("F3").Select

    Selection.AutoFill Destination:=Range("F3:F4"), Type:=xlFillDefault

    Range("F3:F4").Select

    Next x

    End Sub

    Ma credo che quello che volevi fare, fosse questo:

    Sub Prova_Interagire3_Fogli()

    Dim Pippo As Integer, y As Integer

    With Foglio2

    Pippo = 2

    For y = 2 To 10

    If Range("C" & y) > 0 Then

    Pippo = Pippo + 1

    Range("C" & y).Copy .Range("A" & Pippo)

    Range("A" & y).Copy .Range("B" & Pippo)

    Range("D" & y).Copy .Range("c" & Pippo)

    .Range("D" & Pippo) = Range("C" & y) * Range("D" & y)

    .Range("D" & Pippo).Font.Bold = True

    .Range("D" & Pippo).Font.ColorIndex = 3

    End If

    Next y

    .[E2] = "CELLA VALORI"

    .[A2:E2].Font.Bold = True

    .Range("D3:D" & Pippo).Copy

    .[E3].PasteSpecial Paste:=xlPasteValues

    .[F3] = "=D3*E3"

    .[F3].AutoFill Destination:=.Range("F3:F" & Pippo), Type:=xlFillDefault

    'se al termine vuoi attivare il Foglio2

    '.Activate

    End With

    End Sub

    Se guardi la macro che ti ho proposto, noterai che invece di scrivere tutte le volte il Foglio2 basta semplicemente utilizzare il With Foglio2 e iniziare il Range con il punto davanti.

    E che non utilizzo mai il comando .Select

    Inoltre la scrittura Range("A2:E2") può essere anche sintetizzata in questo modo: [A2:E2]

    Se ti interessa imparare e ti piace il vba (o il vb.net) puoi trovarmi sul Forum che vedi sotto.

    Ciao ciao

    Fonte/i: HarryBosch http://www.excelvba.it/
Altre domande? Fai una domanda e ottieni le risposte che cerchi.