• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

Bronbestand voor Code

Status
Niet open voor verdere reacties.

JHH

Gebruiker
Lid geworden
18 aug 2015
Berichten
72
Goedemiddag,

Ik heb 10 gelijke werkmappen met verschillende inhoud, maar met gelijkenamige tabbladen en structuur.
Binnen een werkmap heeft elk tabblad heeft een andere code. Meestal wordt hierbij een macro aangeroepen op basis van een private sub Worksheet_Change.

Aangezien de code continue in ontwikkeling is zou ik graag 1 bronbestand hebben waar de code goedgezet wordt en waar de andere werkmappen de code uithalen, zodat ik de code maar in 1 bestand hoef te onderhouden.

Is dat mogelijk?


alvast bedankt voor de reacties
 
Bedankt voor de reacties.
Ik heb het een en ander gelezen over invoegtoepassingen en begrijp het principe.
Ik heb een test van een .xlam gemaakt. Hier heb ik Module1 gevuld met een Public sub en in het werkbestand.xlsm een code die deze macro moet aanroepen uit de .xlam.
De invoegtoepassing heb ik gestart.

Kop in Module1 van .xlam:
Code:
Public Sub Opmaak_OptieLijst(ByVal Target As Range)
EN

Aanroepcode vanuit werkbestand:
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = True
    Application.Run ("DwMatrix.xlam!Opmaak_OptieLijst")
    
End Sub

ik krijg dan de foutmelding: 449 Het argument is niet optioneel. de fout zou hier in zitten:
Code:
Application.Run ("DwMatrix.xlam!Opmaak_OptieLijst")


weet iemand wat ik verkeerd doe?
 
Je moet uiteraard wel de parameter van die functie meegeven:
Code:
Application.Run ("DwMatrix.xlam!Opmaak_OptieLijst", Target)
 
Beperk je tot

Code:
Sub M_start()
    Opmaak_OptieLijst 
End Sub

Code:
Sub Opmaak_OptieLijst()

End Sub

Dus:

zonder application.run
zonder enableevents
zonder by Val as Range in de aan te roepen macro
en de aanduiding 'Public' kun je ook weglaten (de compiler is slimmer dan je denkt).
 
Laatst bewerkt:
snb: Dat gaat niet als je code uit project A oproept vanuit project B, tenzij je een verwijzing in B naar A maakt.

Ik zou ook de events verplaatsen naar de invoegtoepassing, dan heb je in je andere bestanden helemaal geen code meer nodig, zie voorbeeldje.

Zie ook: http://www.cpearson.com/Excel/AppEvent.aspx
 

Bijlagen

  • App events demo.xlsm
    18,9 KB · Weergaven: 19
Lijkt me niet het grootste struikelblok:

Code:
Sub M_snb()
   ThisWorkbook.VBProject.References.AddFromFile AddIns(25).FullName
End Sub
 
Bedankt voor alle suggesties.
Ik ben niet zo heel erg thuis in VBA, maar ben ondertussen wel een stukje verder. Het voorstel van JKP kan ik nog niet helemaal plaatsen, maar voor het aanleggen van voorwaardelijke opmaak heb ik een macro gemaakt in het xlam bestand en deze wordt netjes geladen:

Code:
Private Sub Workbook_Open()
Application.Run "DwMatrix.xlam!VoorwaardelijkeOpmaakAlg"
End Sub
Maar heb nu een probleem met het aanroepen van een macro in een xlam bestand.
Bij de onderstaande macro krijg ik error 1004: de melding dat de macro niet beschikbaar is of is uitgeschakeld, terwijl de xlam op de achtergrond netjes meeopend.

De code is:
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.Run "DwMatrix.xlam!SalesMacro(Target)"
End Sub

De module heet SalesMacros en de Macro zelf heet SalesMacro. De code in de .xlam start met:
Code:
Sub SalesMacro(ByVal Target As Range)

Application.ScreenUpdating = False
Application.EnableAnimations = False

    Dim LastRow As Long
    Dim OptieGroepKolom As Range
    Dim LastCol As Integer
    Dim LastColLetter As String

    With ActiveSheet... etc.

wat kan hier de oorzaak van zijn? Het enige verschil is dat het een sub is met (ByVal Target As Range)

alvast bedankt voor het meedenken.

mvg Rick
 
Laatst bewerkt:
Doe het eens zo:
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.Run ("DwMatrix.xlam!SalesMacro", Target)
End Sub
 
Laatst bewerkt:
Code:
Application.Run ("DwMatrix.xlam!SalesMacro",Target)

Dan zegt Excel: Compileerfout: verwacht: =
 
Dan geef je dat toch op?
Code:
Ret = Application.Run ("DwMatrix.xlam!SalesMacro", Target)
 
Het werkt! maar ik begrijp niet wat "Ret" betekent. kunt u dat uitleggen?
 
Ret is gewoon een variabele waarin de return status van de Sub wordt opgevangen.
Dat zou ook JHH mogen zijn.
 
Zonder haken en ogen

Code:
Application.Run "DwMatrix.xlam!SalesMacro",Target
 
Highlight Rijen en Kolommen

wat snb zegt werkt idd ook. bedankt.

Ik heb daarnaast nog een automatische highlighting van rijen en kolommen. nu werkt het op een bepaalde sheet vlekkeloos, maar op een andere sheet binnen hetzelfde workbook minder goed. daar moet ik de cel met een dubbelklik editen en dan mweer op enter drukken voordat de betreffende rij en kolom worden gehighlight. terwijl de code gelijk is, en de voorwaardelijke opmaak formules ook omdat die aangelegd worden door de invoegtoepassing.

De code op elke sheet is:
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Application.CutCopyMode = False Then
        Application.Calculate
    End If
End Sub

Wat kan de oorzaak hiervan zijn?
 
Een code voor alle bladen (te plaatsen in ThisWorkbook-module).
Code:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)


End Sub

Om die Voorwaardelijke opmaak te laten werken heb je aan....
Code:
Application.screenupdating =true
....genoeg.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan