Eén VBa van toepassing op alle werkbladen

Status
Niet open voor verdere reacties.

Robert Smidt

Gebruiker
Lid geworden
26 mei 2009
Berichten
947
Beste Helpmij'ers,

Ik heb een vba die alleen zijn werk doet in werkblad "Kolommenbalans". Ik wil echter dat deze betrekking heeft op alle werkbladen.

Code:
Sub beveiligen()
With Sheets("Kolommenbalans").Range("A4:AB500")
  .Value = .Value
End With
End Sub

Alvast bedankt.

Robert
 
Zet er een lusje omheen om door elk werkblad te lopen.
 
Oftewel:
Code:
Sub beveiligen()
    For Each sh In ThisWorkbook.Sheets
        With sh.Range("A4:AB500")
          .Value = .Value
        End With
    Next sh
End Sub
 
De code werkt perfect, alleen krijg ik nu een foutmelding vanuit een andere macro. Is het ook mogelijk dat eerst de vaste macro's uitgezet worden?
 
Zijn dat change_events?
Eens gelezen over?
Code:
application.enableevents = false
 
Afgelopen tijd heb ik al bij meerdere threads de opmerking gemaakt dat foutmeldingen er niet zijn om de gebruiker te pesten. Deze geven aan wat er aan de hand is. Als je dus zegt een foutmelding te krijgen, zet deze er dan ook bij en laat dan ook zien welke macro dat doet en door welk event deze getriggerd wordt.
 
Klopt, je hebt helemaal gelijk dat jullie niet veel kunnen wanneer de foutmelding niet wordt gegeven.

Ik wil mijn bestand (waar inmiddels honderden uren in zitten)beschermen tegen kopiëren en aangezien ik op dit forum heb gelezen dat dit niet mogelijk is, heb ik bedacht om een code te activeren bij een bepaalde handeling zodat alle formules worden gewijzigd in de waarden en het programma in feite waardeloos is geworden.
 
Ik vroeg ook niet om je bestand te plaatsen ;)
Alleen de foutmelding en de macro waarin deze zich voordoet.
 
Dank je, zweet brak mij al uit.

Mijn programma bevat ongeveer 15 werkbladen waarvan er drie niet werken. De foutmelding is bij:

Code:
  .Value = .Value
(deze wordt geel en genereert geen tekst waar de fout in zit)

Als ik de handeling handmatig doe (d.m.v. macro opnemen)
Code:
Sub aa()
    Sheets("Persoonlijke instelling").Select
    Cells.Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("A3").Select
End Sub

Dan gaat het wel goed bij die drie, echter weer niet bij de andere werkbladen. Ik zou dus eigenlijk een soort van mix moeten maken, echter vind ik dat weer behoorlijk amateuristisch.

Eén van de fouten komt ook doordat ik soms met tabellen werk en wanneer hij de formules omzet naar waarden snapt Excel dat niet in kopieert hij voor het hele tabel vreemde tekens.
 
Kopieer eens zo'n blad waar het niet goed bij gaat naar een nieuw bestand, en plaats dat eens.
 
Probeer dit eens.
Doordat ik de verwijzingen niet bezit heb ik 'displayalerts' gebruikt.

Code:
Sub beveiligen()
Dim sh As Worksheet
Application.DisplayAlerts = False
    For Each sh In Sheets
        With sh.UsedRange
          .Value = .Value
        End With
    Next sh
   Application.DisplayAlerts = True
End Sub
 
Als je problemen hebt met vastlopers doordat er mogelijk andere code aangeroepen wordt dan is het handig dat je dat in het bestand zet. De code van edmoor werkt in het bestandje natuurlijk gewoon dus daar zit het probleem niet. Verdiep je ook eens in het gebruik van tabellen. In jouw bestand staat geen tabel maar je hebt een te grote range als tabel gedefinieerd. En dat is toch echt wat anders;)
 
Het ging goed tot aan de bewuste map (met tabel en filter) die ik zojuist heb gestuurd. De eerste fout kom ik dus niet meer tegen. Hij geeft overigens wel weer de fout bij:
Code:
  .Value = .Value
 
Met de gewijzigde code van @edmoor loopt de code goed door jouw bestandje, en maakt van elke formule een waarde.
 
Ik ben bang dat het programma te log is. Ik moet maar op zoek naar een andere vorm van beveiliging. Hebben jullie misschien nog een tip om het programma te beveiligen?
 
Mijn programma bevat ongeveer 15 werkbladen waarvan er drie niet werken. De foutmelding is bij:

Code:
  .Value = .Value
(deze wordt geel en genereert geen tekst waar de fout in zit)

Druk op dat moment op de F8 toets en vertel wat er dan gebeurd.
 
Verdiep je ook eens in het gebruik van tabellen. In jouw bestand staat geen tabel maar je hebt een te grote range als tabel gedefinieerd. En dat is toch echt wat anders;)

@VenA, het is toch wel een echte tabel.
 
@HSV, Als je dit bedoelt als het is een tabel (listobject) dan heb je gelijk. Maar in mijn optiek is een listobject bedoelt, net als in bv Access, als een tabel. In een tabel is elke kolom eenduidig en een tabel bevat geen lege rijen (records)

In het voorbeeldbestandje hieronder is zonder kunstgrepen weinig info te halen uit de tabel 'TbTS' en met de tabel 'TbVenA' kan je eenvoudig alle data ophalen die gewenst is. Maar zoals wel vaker betoogt is het een andere manier van data verzamelen;)
 

Bijlagen

Ik ben inmiddels een stuk verder en er zijn nog twee problemen die zich voordoen. Allereerst gebruik ik de volgende code (die het overigens erg goed doet en de minste fouten geeft)

Code:
Sub beveiligen2()
Dim sh As Worksheet
Application.DisplayAlerts = False
    For Each sh In Sheets
        With sh.UsedRange
          .Value = .Value
        End With
    Next sh
   Application.DisplayAlerts = True
End Sub

De fouten die ik nog krijg bevinden zich in twee afzonderlijke werkmappen:

De eerste foutmelding:
Code:
Private Sub Workbook_SheetActivate(ByVal sh As Object)
If sh.Name = "Resultaatoverzicht" Then [B]sh.ListObjects("tabel1").Range.AutoFilter 19, "show"[/B]
End Sub

Het systeem geeft een fout in: sh.ListObjects("tabel1").Range.AutoFilter 19, "show" (deze staat in "ThisWorkbook")
Vreemd genoeg worden de filters hier verwijderd waardoor bovenstaande fout ontstaat. Ik denk wanneer de filters niet worden verwijderd, deze fout niet meer gegenereerd wordt. Overigens worden vanuit andere werkbladen de filters niet verwijderd.

De tweede fout bevindt zich in onderstaande code
Code:
'Hoofdletters
For Each cl In Range("c3:d500").SpecialCells(xlCellTypeConstants, 2)
[B]Target.Value = Application.WorksheetFunction.Proper(Target)[/B]

De conflictmelding is: Target.Value = Application.WorksheetFunction.Proper(Target)
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan