Monthly Archives: September 2016

Eenvoudig voorbeeld hoe je een collectie gebruikt

Sub SimpleCollection()
    '*********************************************************
    'This procedure reads the values in cell A1 and down to
    'the first empty cell and add them to a collection.
    'After that the values are written to cell C1 and down.
    '*********************************************************
    
    Dim colMyCol As New Collection 'Our collection
    Dim vElement                   'Variant to represent an element
    Dim rRange As Range            'Range variable
    Dim rCell As Range             'Range variable
    Dim lCount As Long             'Counter
    
    Set rRange = Range("A1")
    
    'If cell A1 is empty we cancel and leave the procedure.
    If Len(rRange.Value) = 0 Then GoTo BeforeExit
    
    'If there is anything in A2, we expand rRange to the last empty cell.
    If Len(rRange.Offset(1, 0).Value) > 0 Then
      Set rRange = Range(rRange, rRange.End(xlDown))
    End If
    
    'Now the cell values are added to the collection.
    'Notice that we DON'T give the items a name (key).
    For Each rCell In rRange
      colMyCol.Add rCell.Value
    Next
    
    'Now we write the values to cell C1 and down.
    'Just like a range a collection can be looped with
    'For Each...Next.
    For Each vElement In colMyCol
      Range("C1").Offset(lCount, 0).Value = vElement
      lCount = lCount + 1
    Next
BeforeExit:
    Set colMyCol = Nothing
    Set rRange = Nothing
    Set rCell = Nothing
    
    Exit Sub
ErrorHandle:
    MsgBox Err.Description & " Error in procedure SimpleCollection"
    Resume BeforeExit
End Sub

Haal de ODBC driver naam op

Public Function Get_Driver() As String

Const HKEY_LOCAL_MACHINE = &H80000002
Dim l_Registry As Object
Dim l_RegStr As Variant
Dim l_RegArr As Variant
Dim l_RegValue As Variant

Get_Driver = ""
Set l_Registry = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
l_Registry.enumvalues HKEY_LOCAL_MACHINE, "SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers", l_RegStr, l_RegArr

For Each l_RegValue In l_RegStr
    If InStr(1, l_RegValue, "MySQL ODBC", vbTextCompare) > 0 Then
        Get_Driver = l_RegValue
        Exit For
    End If
Next
Set l_Registry = Nothing

End Function

Een veelzijdige functie om allerlei tekenreeksen te bewerken

Deze veelzijdige en nuttige functie vond ik in een boek genaamd: VBA Developer’s Handbook, 2nd Edition
Dus alle credits gaan naar de schrijvers Ken Getz en Mike Gilbert.

Essentiële functie wanneer je met veel tekenreeksen moet werken bijvoorbeeld postcodes of als je vaak karakters (tekens) moet vervangen binnen een tekenreeks. Ik beveel het boek aan als je zogenaamde bullet-proof vba-code moet schrijven.

Public Function dhTranslate(ByVal strIn As String, _
ByVal strMapIn As String, _
ByVal strMapOut As String, _
Optional lngCompare As VbCompareMethod = vbBinaryCompare) As String
‘ In:
‘ strIn:
‘ String in which to perform replacements
‘ strMapIn:
‘ Map of characters to find
‘ strMapOut:
‘ Map of characters to replace. If the length
‘ of this string is shorter than that of strMapIn,
‘ use the final character in the string for all
‘ subsequent matches.
‘ Example:
‘ dhTranslate(“This is a test”, “aeiou”, “AEIOU”) returns
‘ “ThIs Is A tEst”
‘ Used by:
‘ dhExtractString
‘ dhExtractCollection
‘ dhTrimAll
‘ dhCountWords
‘ dhCountTokens

Dim lngI As Long
Dim lngPos As Long
Dim strChar As String * 1
Dim strOut As String

' If there's no list of characters
' to replace, there's no point going on
' with the work in this function.
If Len(strMapIn) > 0 Then
    ' Right-fill the strMapOut set.
    If Len(strMapOut) > 0 Then
        strMapOut = Left$(strMapOut & String(Len(strMapIn), _
        Right$(strMapOut, 1)), Len(strMapIn))
    End If

    For lngI = 1 To Len(strIn)
        strChar = Mid$(strIn, lngI, 1)
        lngPos = InStr(1, strMapIn, strChar, lngCompare)
        If lngPos > 0 Then
            ' If strMapOut is empty, this doesn't fail,
            ' because Mid handles empty strings gracefully.
            strOut = strOut & Mid$(strMapOut, lngPos, 1)
        Else
            strOut = strOut & strChar
        End If
    Next lngI
End If
dhTranslate = strOut

End Function

Product information

AuthorKen Getz
Co-authorMike Gilbert
FormWith illustration
LanguageDutch
Size66x239x174 mm
Weight1,67 kg
ISBN109041901841
ISBN139789041901842

© Ken Getz en Mike Gilbert

Een variant van deze functie kreeg ik van een profi van het MrExcel forum.
Credits en ©: Rick Rothstein
Dit is een zeer verkorte versie met dezelfde werking.

Function rrTranslate(ByVal strIn As String, _
ByVal strMapIn As String, _
ByVal strMapOut As String, _
Optional lngCompare As VbCompareMethod = vbBinaryCompare) As String
Dim x As Long
    For x = 1 To Len(strMapIn)
        strIn = Replace(strIn, Mid(strMapIn, x, 1), _
        Mid(strMapOut, Application.Max(1, Application.Min(x, Len(strMapOut))), 1))
    Next
    rrTranslate = strIn
End Function

Haal de url uit een hyperlink

Function GetURL(cell As Range, Optional default_value As Variant)
    'Lists the Hyperlink Address for a Given Cell
    'If cell does not contain a hyperlink, return default_value
    If (cell.Range("A1").Hyperlinks.Count <> 1) Then
        GetURL = default_value
    Else
        GetURL = cell.Range("A1").Hyperlinks(1).Address
    End If
End Function

Iets sneller, voor als je een hele kolom moet doen. Selecteer de kolom waarin de hyperlinks staan. Zorg wel dat je rechts van die kolom geen data hebt staan want dat bereik wordt overschreven.

Sub ExtractHL()
Dim HLink As Hyperlink

For Each HLink In Selection.Hyperlinks
    HLink.Range.Offset(0, 1).Value = HLink.Address
Next
End Sub

Je hebt een hele kolom vol met urls maar die zijn platte tekst. Zoiets:
https://www.google.nl/?gws_rd=ssl
https://www.msn.com/nl-nl/?ocid=iehp
https://subscene.com/
https://www.addic7ed.com/
Etc.
Om een hyperlink van al die urls te maken, selecteer ze allemaal en voer de macro uit.

Sub Verander_In_Hyperlinks()
Dim rngCell As Range
    For Each rngCell In Intersect(Selection, ActiveSheet.UsedRange)
        If rngCell <> "" Then
            ActiveSheet.Hyperlinks.Add rngCell, rngCell.Value
        End If
    Next
End Sub

Gegevens ophalen met MySql en importeren in Excel

Nu je een verbinding tot stand hebt gebracht met je MySql database kun je gegevens ophalen. Heb je nog geen verbinding, lees dan eerst dit bericht, “Connector/ODBC installeren”

Klik op: Gegevens | Van andere bronnen | MS Query

Je kiest de gegevensbron die je al eerder hebt aangemaakt in dit geval Unicode.

Let op ! ! ! Kruis het vak “Query’s maken/bewerken met behulp van de wizard query”

Er verschijnt een mededeling: “Verbinding maken met de gegevensbron”

In het volgende venster zie je de tabellen die in je database staan. In dit voorbeeld maak ik gebruik van de tabel van “Noordenwind”. Dat is een soort voorbeeldtabel van Microsoft. Onderaan zal ik kort toelichten hoe je die voorbeeldtabellen kunt installeren.

Klik op “Noordenwind” (of je eigen tabellen) en vervolgens op het “>” teken om de tabellen toe te voegen. Ze staan nu rechts in het venster. Klik op “Volgende”.

Doorloop de venster “Filteren en Sorteren”. Tenslotte voor “Weergeven in Excel” en “Voltooien”. En voilà, daar staan de gegevens.

Je kunt de gegevens nog aanpassen door in het lint te kiezen voor de tab “Hulpmiddelen voor tabellen” en vervolgens op “Eigenschappen” te klikken.

Let op ! ! ! Met de kleine knop rechts kun je nog meer instellen. Bijvoorbeeld of je de data wil bijwerken als de map opnieuw geopend wordt.

In de andere tab kun je de query veranderen mocht je dat willen.

Nog even over het importeren van de tabellen van ‘Noordenwind” of “Northwind” als je het Engels prefereert. Ik ga er van uit dat je al een database hebt en weet hoe je die moet benaderen. Bijvoorbeeld met het programma “phpmyadmin”.

Download dan hier het sql bestand

1. Pak het zip bestand uit.

2. Indien je phpmyadmin gebruikt, selecteer je je database en kiest voor importeren.

3. Klik op “Bestand kiezen” en zoek het zojuist uitgepakte sql-bestand (northwind.sql) en klik op “Start”.

4.Importeer vervolgens het bestand northwind-data.sql

Haal data op uit MySQL met VBA

Lees eerst deze berichten:

Connector/ODBC installeren
Gegevens ophalen met MySQL en importeren in Excel

Met onderstaande code kun je automatisch data lezen uit je MySQL database. Voorop gesteld dat je bovenstaande berichten hebt gelezen en uitgevoerd.

Sub SelecteerDataVanMySQL()
    
    Dim SQLStr As String
    Dim Cn As ADODB.Connection
    Dim Server_Name As String
    Dim Database_Name As String
    Dim User_ID As String
    Dim Password As String
    Dim Table As String
    Dim rs As ADODB.Recordset
    Dim rngKolom As Integer
    Dim rngRij As Integer
    Dim myArray()
    Dim K As Integer
    Dim R As Integer
    
    'Set variable
    Set rs = New ADODB.Recordset
    
    'Clear the range
    Range("a5:bb60000").ClearContents
    
    'Connection properties
    Server_Name = "YOUR SERVER NAME"
    Database_Name = "YOUR DATABASE NAME"
    User_ID = "YOUR USER ID"
    Password = "YOUR PASSWORD"
    Table = "YOUR TABLE NAME"
    Field = "YOUR FIELD NAME"

    'Create a mysql query string
    SQLStr = "SELECT * FROM " & Table & " WHERE " & Field & "  = 2"
    
    'Connect to the database
    Set Cn = New ADODB.Connection
    Cn.Open "Driver={MySQL ODBC 5.3 Unicode Driver};Server=" & _ 
        Server_Name & ";Database=" & Database_Name & ";Uid=" & _
        User_ID & ";Pwd=" & Password & ";"
    
    'Create a recordset
    rs.Open SQLStr, Cn, adOpenStatic
    
    'Store rs in array variable
    myArray = rs.GetRows()
    rngKolom = UBound(myArray, 1)
    rngRij = UBound(myArray, 2)
    For K = 0 To rngKolom
        'Transfer recordset data to worksheet
        Range("A5").Offset(0, K).Value = rs.Fields(K).Name
        For R = 0 To rngRij
            Range("A5").Offset(R + 1, K).Value = myArray(K, R)
        Next
    Next
    'Close the connection
    rs.Close
    Set rs = Nothing
    Cn.Close
    Set Cn = Nothing
End Sub

Tel de waarde van elke n-th rij op

Vandaag een zogenaamde MATRIX formule die de waarde van elke n-th rij optelt.  De n staat normaal voor de onbekende. In dit voorbeeld staat de n voor de 3e rij. We gaan dus de waarde van elke 3e rij optellen.

1. De functie RIJ geeft het rijnummer van een cel.

2. De functie REST geeft de rest van een deling. Bijvoorbeeld,  REST(1;3) geeft 1, want 1:3 geeft een rest van 1. De 3e rij echter, geeft een ander resultaat, REST(3;3) geeft een rest van 0. Het resultaat van de functie REST geeft 0 voor telkens de 3e rij.

Opmerking: je kunt ook elke 4e rij of 5e rij optellen.

3. Verander de functie zoals in het onderstaande voorbeeld.

4. Je ziet nu dat elke 3e rij de waarde WAAR geeft en dat gegeven gebruiken we om de naast liggende waarden op te tellen. Om waarden op te tellen gebruik je de functie SOM. Maar we willen de formule in één cel zetten die vervolgens al het werk doet.

Selecteer daarom cel A10. Nu type je de formule zoals aangegeven. Je moet de formule invoeren als zogenaamde MATRIX. In plaats van op Enter te drukken voer je de formule in door middel van  Ctrl + Shift + Enter.

Opmerking: De formule balk geeft aan dat het hier om een MATRIX formule gaat. Dat kun je zien aan de accolades { } . Deze accolades moet je niet zelf typen want dan werkt de formule niet.

Eigenlijk ziet de MATRIX er als volgt uit. De getallen 5, 66, 21 worden dus opgeteld, met als resultaat 92.

{0;0;5;0;0;66;0;0;21}

Connector/ODBC installeren

Stel, je wilt gegevens uit je MySql database lezen vanuit Excel. Dan moet je eerst een verbinding tot stand brengen en dat is moeilijk.
Volg deze stappen. Surf naar:
https://dev.mysql.com/downloads/connector/odbc/
Hier staat dat je een zogenaamde Connector/ODBC kunt downloaden en daar begint het al. Moet je de 32-bits of de 64-bits versie hebben. Ligt aan je Excel versie dus check dat eerst via:

File | Account | About Excel

Bij oudere Excel versie:

Al naar gelang je versie, download je de juiste driver op de website. Gebruik de uitklaplijst bij: Select Version om te kiezen voor 32-bit of 64-bit.

Vervolgens verschijnt er nog een venster. Registreren is onnodig. Scroll naar beneden en klik gewoon op: “No thanks just start my download”

Na het downloaden, installeer je de driver. Daarna voer je de volgende stappen uit:

1. Je moet de ODBC-gegevensbron eerst openen. Dat kan op twee manieren:
a. Klik op de knop Start, dan Configuratiescherm | Systeem en beveiliging | Systeembeheer. Of:
b. Voor de 32-bit versie > > > kies voor: Uitvoeren > > > vul in: c:\windows\sysWOW64\odbcad32.exe
Voor de 64-bit versie > > > kies voor: Uitvoeren > > > vul in: c:\windows\system32\odbcad32.exe

Nu kom je in bovenstaand overzicht. Daar kunnen 2 versies staan. Wederom 32-bit of 64-bit. Dubbelklik op de versie die overeenkomt met jouw Excel versie.

2. In het volgende venster klik je op Toevoegen

Kies het juiste stuurprogramma voor de gegevensbron die je toevoegt. Wij kiezen voor:

MySQL ODBC 5.3 ANSI Driver of de Unicode Driver.

Klik vervolgens op Voltooien.

3. Je komt nu in het venster MySql Connector/ODBC Data Source Configuration. Typ in het vak Naam van gegevensbron een naam voor de gegevensbron. Je kunt ook een beschrijving typen waaraan je later kunt zien waarvoor deze gegevensbron wordt gebruikt. Bij TCP/IP server geef je de naam van je server * op evenals User en Password. Klik op de knop Test om de verbinding te controleren. Kies je database en dan OK.

* Indien je Xampp lokaal geïnstalleerd hebt is standaard de servernaam “Localhost” en de User is “root”. Password is niet nodig. Bij jou kunnen die gegevens dus iets anders zijn.

Van Rechts naar Links zoeken met INDEX en VERGELIJKEN

Heb je ooit geprobeerd een waarde op te zoeken die links ligt t.o.v. de zoekkolom (rechts)? Dan heb je gemerkt dat de functie V.LOOKUP niet werkt. Voor die gelegenheid heb je de functies INDEX en MATCH nodig.

De functie MATCH zoekt de waarde in C6 en geeft als resultaat de positie van die waarde (en die is 5). Die positie wordt in de functie INDEX gebruikt om de 5e waarde in kolom A op te zoeken (en dat is bloemkool . . . lekker ! ! !).

In [D2] =INDEX($A$2:$A$9;MATCH(C6;$C$2:$C$9;0)

HTML tags verwijderen uit tekst

Functie heeft een verwijzing nodig.
In de VBE, Extra | Verwijzingen
Microsoft VBScript Regular Expressions 5.5

Handige functie om de HTML tags uit een webpage te verwijderen.

Function stripHTML(strHTML)

    'Strips the HTML tags from strHTML
    Dim objRegExp, strOutput
    Set objRegExp = New Regexp

    objRegExp.IgnoreCase = True
    objRegExp.Global = True
    objRegExp.Pattern = "<(.|\n)+?>"

    'Replace all HTML tag matches with the empty string
    strOutput = objRegExp.Replace(strHTML, "")

    'Replace all < and > with &lt; and &gt;
    strOutput = Replace(strOutput, "<", "&lt;")
    strOutput = Replace(strOutput, ">", "&gt;")
    
    'Return the value of strOutput
    stripHTML = strOutput

    Set objRegExp = Nothing
End Function