Condividi tramite

Richiamare macro da altra macro

Anonimo
2010-12-21T18:10:52+00:00

Buonasera a tutti, volevo chiedere un aiuto per come poter richiamare da una macro ( che segue ) 

Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)

    Dim wkB As Workbook

    Dim shB As Worksheet

    Dim wkC As Workbook

    Dim shC As Worksheet

    Dim lRiga As Long

    Dim lRisposta As Long

    Set wkB = Workbooks("B.xls")

    Set shB = wkB.Worksheets("Foglio1")

    Set wkC = Workbooks("C.xls")

    Set shC = wkC.Worksheets("Foglio1")

    lRisposta = MsgBox("Inserire i dati?", vbYesNo + vbQuestion, "Attenzione")

    If lRisposta = vbYes Then

        With Sh

            lRiga = .Range("C87:C" & .Rows.Count).End(xlUp).Row

            shB.Range("C1").Value = .Name

            shB.Range("J4:O4").Value = .Range("C" & lRiga).Value

            shB.Range("J7:M7").Value = .Range("E" & lRiga).Value

            shB.Range("N10").Value = .Range("F" & lRiga).Value

            shB.Range("N17").Value = .Range("G" & lRiga).Value

            shB.Range("C8:E8").Value = .Range("M" & lRiga).Value

            shB.Range("F43").Value = .Range("N" & lRiga).Value

            shB.Range("F18").Value = .Range("X" & lRiga).Value

            shB.Range("N30").Value = .Range("O" & lRiga).Value

            shB.Range("F16").Value = .Range("AA" & lRiga).Value

            shB.Range("M37").Value = .Range("AB" & lRiga).Value

            shB.Range("E36").Value = .Range("AC" & lRiga).Value

            shB.Range("F22:F23").Value = .Range("Y" & lRiga).Value

            shB.Range("C4:E4").Value = .Range("W" & lRiga).Value

            shB.Range("O31").Value = .Range("AD" & lRiga).Value

            shB.Range("E47:F47").Value = .Range("R" & lRiga).Value

            shB.Range("C6:E6").Value = .Range("AE" & lRiga).Value

            shC.Range("D3:O3").Value = .Range("C" & lRiga).Value

            shC.Range("T3:W3").Value = .Range("E" & lRiga).Value

            shC.Range("D5:H5").Value = .Range("Z" & lRiga).Value

             .Range("L" & lRiga).Value = shB.Range("N39").Value

        End With

    End If

    Set shB = Nothing

    Set wkB = Nothing

    Set shC = Nothing

    Set wkC = Nothing

End Sub

queste presenti in un unico modulo

========

Sub Start()

'

' Start Macro

ActiveSheet.Unprotect

    Range( _

 "C4:E4,C6:E6,C8:E8,C10,C12,F12,F14,F16,F18,F22:F23,F29,c34,c35,c36,e30,e34,e35,e36,f43,E45:F45,J4:O4" _

        ).Select  <====

    Selection.ClearContents

    Range("A1").Select

ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:= _

        False

End Sub

=================

Sub Stampa()

'

' Stampa Macro

 ActiveSheet.Unprotect

 Range("A1:P49").Select

    Selection.PrintOut Copies:=1, Collate:=True

    Range("A1").Select

ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:= _

        False

End Sub

volevo in pratica evitare ogni volta che devo copia/incollare, dal file A.xls su B.xls,  cancellare i dati dal Foglio1 di B.xls, togliere la protezione e poi effettuare il copia/incolla. Non so se è chiaro quello che vorrei fare, lo spero. Grazie per l'eventuale interessamento e buona serata.

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2010-12-27T13:48:19+00:00

, stupida, ma la faccio lo stesso: nello scrivere un codice si utilizza un linguaggio convenzionale o colui, ovviamente, che progetta il codice ne usa uno suo. E' possibile sapere se esiste in maniera didattica, e come reperirla, qualche indicazione al riguardo? E' solo per poter imparare a capire qualcosa in più.

Comunque Mauro grazie come sempre per la tua pazienza e cortesia. Buona giornata.

Ci sono le regole di sintassi. Poi ci sono vari modi di scrivere il codice. Buoni e cattivi. E buoni e cattivi è opinabile.


--

La soluzione, il codice ed i files sono forniti *così come sono* e l’autore declina ogni responsabilità per eventuali problemi causati dalla soluzione proposta se usata impropriamente. Create e utilizzate una copia del file per le vostre prove, *prima* di utilizzare la soluzione in files importanti.

--

Mauro Gamberini - Microsoft© MVP(Excel)

http://www.maurogsc.eu/

Aggiungo. Tutte le macro qui sotto scrivono nella cella A1 del Foglio1 se questa è la cella attiva. Se non è più attivo il Foglio1, i risultati sono diversi:

Public Sub m_1()

    Range("A1") = 5

End Sub

Public Sub m_2()

    [A1] = 5

End Sub

Public Sub m_3()

    ActiveCell.Value = 5

End Sub

Public Sub m_4()

    ActiveSheet.Range("A1") = 5

End Sub

Public Sub m_5()

    Cells(1, 1) = 5

End Sub

Public Sub m_6()

    Foglio1.Range("A1").Value = 5

End Sub

Public Sub m_7()

    Dim sh As Worksheet

    Set sh = ThisWorkbook.Worksheets("Foglio1")

    With sh

        .Range("A1").Value = 5

    End With

    Set sh = Nothing

End Sub

Nota bene. Non sto dicendo che ci sono macro buone o cattive fra quelle qui sopra. Sono macro che fanno cose diverse in contesti diversi. E questo, lo impari con l'esperienza.


--

La soluzione, il codice ed i files sono forniti *così come sono* e l’autore declina ogni responsabilità per eventuali problemi causati dalla soluzione proposta se usata impropriamente. Create e utilizzate una copia del file per le vostre prove, *prima* di utilizzare la soluzione in files importanti.

--

Mauro Gamberini - Microsoft© MVP(Excel)

http://www.maurogsc.eu/

La risposta è stata utile?

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2010-12-23T08:03:46+00:00

Buonasera Mauro e scusa se solo adesso rispondo alla tua risposta ( precedentemente non ero io, ma Alfredotto che ringrazio per la risposta  ).

>Capito poco poco, ma proviamo scusa, ho cercato di sintetizzare ma ho fatto poca chiarezza

Ho inserito nella macro il tuo suggerimento, ho provato e pulisce le celle prima di inserire i nuovi dati. Ho eliminato questa parte di codice

With shB    .Protect    .PrintOutEnd With

perchè la stampa non la vorrei automatizzare, mentre così dopo la copia avviene la stampa.

Il problema " fastidioso " è che rimane sempre la protezione del foglio ed ogni volta devo togliere la protezione tramite >Strumenti>Protezione>Rimuovi protezione foglio> dopodichè effettuare il copia/incolla.

 Solo togliendo, nelle due macro questa parte di codice, mi permette di evitare quanto sopra  

ActiveSheet.Unprotect'

ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:= _        Falsesolo che non vorrei, per sicurezza, fare questo e chiedevo se si poteva ovviare in qualche maniera.

Grazie di nuovo per la cortese pazienza e buona serata.

Mi era rimasto un pezzo di codice nella tastiera... scusa, inoltre vedo che hai anche un file C.xls. Modifica così:

Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)

    Dim wkB As Workbook

    Dim shB As Worksheet

    Dim wkC As Workbook

    Dim shC As Worksheet

    Dim lRiga As Long

    Dim lRisposta As Long

    Set wkB = Workbooks("B.xls")

    Set shB = wkB.Worksheets("Foglio1")

    Set wkC = Workbooks("C.xls")

    Set shC = wkC.Worksheets("Foglio1")

    Sh.Unprotect

    shB.Unprotect

    shC.Unprotect

    With shB

    .Range("C4:E4,C6:E6,C8:E8,C10,C12,F12,F14,F16,F18," & _

        "F22:F23,F29,c34,c35,c36,e30,e34,e35,e36,f43,E45:F45,J4:O4").ClearContents

    End With

    lRisposta = MsgBox("Inserire i dati?", vbYesNo + vbQuestion, "Attenzione")

    If lRisposta = vbYes Then

        With Sh

            lRiga = .Range("C87:C" & .Rows.Count).End(xlUp).Row

            shB.Range("C1").Value = .Name

            shB.Range("J4:O4").Value = .Range("C" & lRiga).Value

            shB.Range("J7:M7").Value = .Range("E" & lRiga).Value

            shB.Range("N10").Value = .Range("F" & lRiga).Value

            shB.Range("N17").Value = .Range("G" & lRiga).Value

            shB.Range("C8:E8").Value = .Range("M" & lRiga).Value

            shB.Range("F43").Value = .Range("N" & lRiga).Value

            shB.Range("F18").Value = .Range("X" & lRiga).Value

            shB.Range("N30").Value = .Range("O" & lRiga).Value

            shB.Range("F16").Value = .Range("AA" & lRiga).Value

            shB.Range("M37").Value = .Range("AB" & lRiga).Value

            shB.Range("E36").Value = .Range("AC" & lRiga).Value

            shB.Range("F22:F23").Value = .Range("Y" & lRiga).Value

            shB.Range("C4:E4").Value = .Range("W" & lRiga).Value

            shB.Range("O31").Value = .Range("AD" & lRiga).Value

            shB.Range("E47:F47").Value = .Range("R" & lRiga).Value

            shB.Range("C6:E6").Value = .Range("AE" & lRiga).Value

            shC.Range("D3:O3").Value = .Range("C" & lRiga).Value

            shC.Range("T3:W3").Value = .Range("E" & lRiga).Value

            shC.Range("D5:H5").Value = .Range("Z" & lRiga).Value

            .Range("L" & lRiga).Value = shB.Range("N39").Value

        End With

    End If

    Sh.Protect

    shB.Protect

    shC.Protect

    Set shB = Nothing

    Set wkB = Nothing

    Set shC = Nothing

    Set wkC = Nothing

End Sub

Se hai un errore, mi serve sapere *dove* hai l'errore. Se gestisci bene Protect/Unprotect, la sicurezza rimane quella(poca) della protezione possibile per i fogli di Excel. Se vuoi aggiungere gli argomenti dopo Protect, fallo. Una volta impostati sono però memorizzati e non importa ripeterli.


--

La soluzione, il codice ed i files sono forniti *così come sono* e l’autore declina ogni responsabilità per eventuali problemi causati dalla soluzione proposta se usata impropriamente. Create e utilizzate una copia del file per le vostre prove, *prima* di utilizzare la soluzione in files importanti.

--

Mauro Gamberini - Microsoft© MVP(Excel)

http://www.maurogsc.eu/

La risposta è stata utile?

0 commenti Nessun commento

15 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2010-12-22T09:35:59+00:00

    Buonasera Mauro e grazie per l'interessamento.

     Io ho un file A.xls dove inserisco dei dati che vanno copia/incollati su file B.xls e C.xls.

    Nel Foglio1 di B.xls ho delle celle su cui copia/incollare i dati provenienti da A.xls ed ogni volta che devo fare questo copia/incolla devo prima cancellare i dati presenti in queste celle per far posto ai nuovi dati da inserire. Per questo ho una macro che richiamo tramite un pulsante che mi cancella tutti i dati nelle celle selezionate all'interno della macro. Questo perchè non sempre i nuovi dati vanno copia/incollati su tutte le celle.

     

    Poi devo togliere la protezione tramite " Rimuovi protezione foglio " perchè dopo che stampo il foglio e lo faccio ogni nuovo inserimento di dati, viene di nuovo protetto ( ma questa protezione si potrebbe eventualmente togliere ) e quando vado ad effettuare il copia/incolla se non faccio questa operazione mi va in errore. 

    Non so se è sufficientemente chiaro ora. Scusami e grazie per la tua disponibilità e pazienza. 

    Capito poco poco, ma proviamo. Se devi *pulire* le celle del File B.xls prima di copiarv i nuovi dati, aggiungi il codice qui sotto *prima* della riga con lRisposta = ecc. :

    With shB

        .Range("C4:E4,C6:E6,C8:E8,C10,C12,F12,F14,F16,F18," & _

            "F22:F23,F29,c34,c35,c36,e30,e34,e35,e36,f43,E45:F45,J4:O4").ClearContents

    End With

    e il codice qui sotto *prima* sei Select = Nothing:

    With shB

        .Protect

        .PrintOut

    End With

    Fai sapere, grazie.


    --

    La soluzione, il codice ed i files sono forniti *così come sono* e l’autore declina ogni responsabilità per eventuali problemi causati dalla soluzione proposta se usata impropriamente. Create e utilizzate una copia del file per le vostre prove, *prima* di utilizzare la soluzione in files importanti.

    --

    Mauro Gamberini - Microsoft© MVP(Excel)

    http://www.maurogsc.eu/

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2010-12-21T19:11:43+00:00

    Buonasera Mauro e grazie per l'interessamento.

     Io ho un file A.xls dove inserisco dei dati che vanno copia/incollati su file B.xls e C.xls.

    Nel Foglio1 di B.xls ho delle celle su cui copia/incollare i dati provenienti da A.xls ed ogni volta che devo fare questo copia/incolla devo prima cancellare i dati presenti in queste celle per far posto ai nuovi dati da inserire. Per questo ho una macro che richiamo tramite un pulsante che mi cancella tutti i dati nelle celle selezionate all'interno della macro. Questo perchè non sempre i nuovi dati vanno copia/incollati su tutte le celle.

    Poi devo togliere la protezione tramite " Rimuovi protezione foglio " perchè dopo che stampo il foglio e lo faccio ogni nuovo inserimento di dati, viene di nuovo protetto ( ma questa protezione si potrebbe eventualmente togliere ) e quando vado ad effettuare il copia/incolla se non faccio questa operazione mi va in errore. 

    Non so se è sufficientemente chiaro ora. Scusami e grazie per la tua disponibilità e pazienza.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2010-12-21T18:19:24+00:00

    <cut>

    volevo in pratica evitare ogni volta che devo copia/incollare, dal file A.xls su B.xls,  cancellare i dati dal Foglio1 di B.xls, togliere la protezione e poi effettuare il copia/incolla. Non so se è chiaro quello che vorrei fare, lo spero. Grazie per l'eventuale interessamento e buona serata.

    Non ho capito cosa vuoi fare. Puoi spiegare a parole, senza preoccuparti del codice per ora? Anche una lunga spiegazione, purchè chiara. Grazie.


    --

    La soluzione, il codice ed i files sono forniti *così come sono* e l’autore declina ogni responsabilità per eventuali problemi causati dalla soluzione proposta se usata impropriamente. Create e utilizzate una copia del file per le vostre prove, *prima* di utilizzare la soluzione in files importanti.

    --

    Mauro Gamberini - Microsoft© MVP(Excel)

    http://www.maurogsc.eu/

    La risposta è stata utile?

    0 commenti Nessun commento