Vind mijn printer

Geplaatst op

Ooit gevonden in een van de nieuwsgroepen over Excel. Als je in een netwerk hangt waarbinnen meerdere printers zijn geïnstalleerd, is het handig om de JUISTE printer te vinden. In onderstaand voorbeeld wordt naar de HP Photosmart gezocht en selecteert deze. Eenmaal geselecteerd kun je die gebruiken om je document af te drukken.

Let op ! ! !
Op 64-bit systemen gebruik je het woord ptrSafe in de declaratiesectie Private Declare PtrSafe Function etc. Op 32-bit systemen kun je dat woord wissen.

‘******************************************************************
‘Geschreven door keepITcool
‘Vereist xl2000 of nieuwer.
‘Geeft als resultaat een zerobased matrix van geïnstalleerde printers
‘De resultaten worden gefilterd op basis van het argument “Match string” (niet hoofdletter gevoelig),
‘Indien geen resultaten dan is de bovengrens -1
‘******************************************************************

Option Explicit
Private Declare PtrSafe Function GetProfileString Lib "kernel32" _
Alias "GetProfileStringA" (ByVal lpAppName As String, _
ByVal lpKeyName As String, ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Long) As Long

Sub test()
Dim vaList

'Get all printers
vaList = PrinterFind

'Show me
MsgBox Join(vaList, vbLf), , "List of printers"

'Get all HP Photosmart printers
vaList = PrinterFind(Match:="Photosmart")

'Switch to the first Photosmart found
If UBound(vaList) = -1 Then
    MsgBox "Printer not found"
ElseIf MsgBox( _
    "from " & vbTab & ": " & ActivePrinter & vbLf & "to " & _
    vbTab & ": " & vaList(0), vbOKCancel, _
    "Switch Printers") = vbOK Then
    Application.ActivePrinter = vaList(0)
End If

End Sub

Public Function PrinterFind(Optional Match As String) As Variant
Dim n%, lRet&, sBuf$, sCon$, aPrn
Const lLen& = 1024, sKey$ = "devices"

'******************************************************************
'Geschreven door keepITcool
'Vereist xl2000 of nieuwer.
'Geeft als resultaat een zerobased matrix van geïnstalleerde printers
'De resultaten worden gefilterd op basis van het argument "Match string" (niet hoofdletter gevoelig),
'Indien geen resultaten dan is de bovengrens -1
'******************************************************************

'Split ActivePrinter string to get localized word for "on"
aPrn = Split(Excel.ActivePrinter)
sCon = " " & aPrn(UBound(aPrn) - 1) & " "

'Read all installed printers (1k bytes s/b enough)
sBuf = Space(lLen)
lRet = GetProfileString(sKey, vbNullString, vbNullString, sBuf, lLen)

If lRet = 0 Then
    Err.Raise vbObjectError + 513, , "Can't read Profile"
    Exit Function
End If

'Split buffer string to a zero based array
aPrn = Split(Left(sBuf, lRet - 1), vbNullChar)

'Optionally Filter the array on Match
If Match <> vbNullString Then aPrn = Filter(aPrn, Match, -1, 1)

'Append localized "on" and 16bit portname for each Printer
For n = LBound(aPrn) To UBound(aPrn)
    sBuf = Space(lLen)
    lRet = GetProfileString(sKey, aPrn(n), vbNullString, sBuf, lLen)
    aPrn(n) = aPrn(n) & sCon & _
    Mid(sBuf, InStr(sBuf, ",") + 1, lRet - InStr(sBuf, ","))
Next

'Return the result
PrinterFind = aPrn

End Function

Afhankelijke keuzelijst

Geplaatst op

Gegevensvalidatie is handig om de gebruiker een bepaalde lijst te laten zien afhankelijk van de keuze die de gebruiker maakt.

Stel, we hebben 2 landen. Nederland en België. Afhankelijk van de landkeuze die de gebruiker maakt, krijgt hij de bijbehorende provincies te zien.

Voorbeeld:

 photo provincies_zpsez38pljb.png

Werkwijze:

– Plaats de gegevens in je werkblad zoals hierboven.
– Landen in B2 (Nederland) en C2 (België). Daaronder de provincies.
– Selecteer het bereik B2:C14
– Je gaat nu 2 namen geven aan de bereiken.
– Gebruik daarvoor de sneltoets combinatie: Ctrl + Shift + F3.
– Je ziet nu een venster. Vink de bovenste optie aan, “Bovenste rij”. Hiermee krijgen 2 bereiken een naam.

 photo 2015-04-27_12-12-14_zpsmkpdixgi.png


– Selecteer E2:E14 en maak gegevensvalidatie voor Nederland en België.  Toetscombinatie Alt, E, H, V
– Zet in het vak “Bron:” =$B$2:$C$2

 photo 2015-04-27_12-12-53_zpszk9t4pbm.png

– Hetzelfde doe je voor het bereik F2:F14, en maak weer gegevensvalidatie voor Nederland en België. Toetscombinatie Alt, E, H, V
– Let op ! ! ! Zet in het vak “Bron:” =INDIRECT(E2)

 photo 2015-04-27_12-13-34_zpslekvimrt.png

Hoe werkt dit?

In cel E2 heb je 2 opties namelijk Nederland of België. Kies je Nederland dan zal de gegevensvalidatie in cel F2 verwijzen naar de formule =INDIRECT(Nederland), die op haar beurt verwijst naar B3:B14. Hetzelfde geldt als je voor België kiest.

Gedeeltelijke overeenkomst zoeken

Geplaatst op

Soms wil je weten of een bepaald woord of een gedeelte van dat woord binnen een stuk tekst of een zin voorkomt. Dat woord kan tot een bepaalde categorie horen. Bijvoorbeeld provincienamen. Met de volgende formule in B2 kan dat.

In cel B2:

=ZOEKEN(1;1/AANTAL.ALS(A2;”*”&$D$2:$D$13&”*”);$D$2:$D$13)

Doorvoeren naar beneden. In dit geval tot B13.

 photo Gedeeltelijke_Overeenkomst_zpsh7xymcap.png

De tekst waarbinnen gezocht moet worden staat in kolom A. In kolom B de formule. Je provincienamen staan in kolom D.

Zie ook: Gedeeltelijke overeenkomst zoeken in kolom en resultaten tonen in andere kolom.

Wildcard in verticaal zoeken

Geplaatst op

Verticaal zoeken met behulp van een zogenaamde “wildcard”.

– Het zoekbereik is A2:B10.
– In kolom D staan gedeeltelijke overeenkomsten (delen van namen) die je wil opzoeken in kolom A.
– In Kolom E komt de formule om de bijbehorende ContactName (Kolom B) te zoeken, te beginnen in E2. Doorvoeren tot cel E10.

=VERT.ZOEKEN(“*”&D2&”*”;$A$2:$B$10;2;0)

Een alternatieve manier is:

=ZOEKEN(2^15;VIND.SPEC(D13;$A$2:$A$10);$B$2:$B$10)

Deze formule zet je in E13 en vervolgens doorvoeren naar beneden.

 photo Wildcard_zpsdrpbs130.png

Hoogste waarde in rij markeren

Geplaatst op

Vind de hoogste waarde in elke rij en markeer die waarde. Ook als er 2 waarden even hoog zijn. Werkt ook als er een lege rij is.

Sub MarkeerHoogsteWaardeInRij()
  Dim rngRij As Range, Max As Double
  Application.ReplaceFormat.Clear
  Application.ReplaceFormat.Interior.ColorIndex = 7
  For Each rngRij In ActiveSheet.UsedRange.Rows
    rngRij.Replace Application.Max(rngRij.Value), "", SearchFormat:=False, ReplaceFormat:=True
  Next
  Application.ReplaceFormat.Clear
End Sub

Laatste n boekingen tonen

Geplaatst op

Je wilt de laatste n boekingen zien. In dit geval n=10.

Wil je slechts 5 boekingen zien verander dan in de formule:
A4 =MIN(10;SOM
in
A4 =MIN(5;SOM

De lijst staat in het bereik C2:D17. In A2 vul de klant in. Dan de formules:

LET OP ! ! !
Beide formules invoeren met Ctrl+Shift+Enter.

A4 =MIN(10;SOM(ALS(INTERVAL(ALS($C$2:$C$17=A$2;ALS($D$2:$D$17<>””;VERGELIJKEN($D$2:$D$17;$D$2:$D$17;0)));RIJ($D$2:$D$17)-RIJ($D$2)+1);1)))

A6 =ALS(RIJEN(A$6:A6)<=A$4;INDEX($D$2:$D$17;KLEINSTE(ALS(INTERVAL(ALS($C$2:$C$17=A$2;ALS($D$2:$D$17<>””;VERGELIJKEN($D$2:$D$17;$D$2:$D$17;0)));RIJ($D$2:$D$17)-RIJ($D$2)+1);RIJ($D$2:$D$17)-RIJ($D$2)+1);RIJEN(A$6:A6)));””)

Doorvoeren naar beneden. Hoe? Klik op het kleine vierkantje rechtsonder in cel A6 (de vulgreep) en sleep de formule naar beneden naar cel A7, A8 en A9.

Kolomletter vinden

We geven een zoekterm op en willen de kolomletter vinden waarin deze zoekterm zich bevindt. Laten we zoeken naar:

San Cristóbal

Zet die naam ergens in een sheet (bijvoorbeeld in E4) en vul die naam in onderstaande code in. De MsgBox geeft als antwoord de kolomletter.

Sub Find_Column_Letter()
    Set cell = Cells.Find("San Cristóbal", , xlValues, xlPart, , , False)
    If Not cell Is Nothing Then
      ColLetter = Split(cell.Address, "$")(1)
      MsgBox ColLetter
    Else
      MsgBox "I cannot find that text on this sheet"
    End If
End Sub

Bestanden hernoemen

Geplaatst op

Je wilt een boel bestanden hernoemen. Daar bestaat speciale software voor. Toch kan dat ook met Excel. Om te beginnen start je het programma cmd.exe ofwel de “command prompt”. Even op de startknop van Windows klikken (linksonder) en in het zoekvenster cmd typen. Bestandsnaam verschijnt ergens boven, rechtsklikken en uitvoeren als administrator.

In het zwarte venster dat verschijnt ga je naar de map waar je bestanden staan. Ik koos voor C:\TEMP. Daar kom je als volgt. Tik eerst:
cd \ en dan cd TEMP en tenslotte dir /b
Je krijgt dan de bestandsnamen te zien. Eventueel venster groter maken. Door nu linksboven op dat klein zwart icoon te klikken, komt er een menu. Kies voor Edit | Mark. Je kunt nu door te slepen met de muis je bestanden selecteren. Eenmaal alles geselecteerd kiezen voor Edit | Copy (kopiëren)

Schakel over naar Excel, selecteer A1 en kies voor Paste (plakken). Zo, nu staan alle bestandsnamen onder elkaar (rode gedeelte). We willen het volgende gedeelte in de bestandsnaam verwijderen:
.WEB-DL-NTb.Dutch.edit.Addic7ed.com

Selecteer cel B1 en voer de volgende formule in:
=SUBSTITUEREN(A1;”.WEB-DL-NTb.Dutch.edit.Addic7ed.com”;””)
Doorvoeren naar beneden.Nu heb je in Kolom B de juiste bestandsnamen staan (groene gedeelte).

Tenslotte onderstaande code in een module plakken. Alt+F11 | Invoegen | Module en plakken.  Code uitvoeren door op F5 te drukken. Als de code vraagt om de juiste map aan te geven ga je naar de map waar je je bestanden hebt staan.

Option Explicit

'I presume you've got a lot of file names. 10, 100 or 1000?
'- Start up command prompt (cmd.exe) and run as administrator.
'- Go to directory where your files are. Let's presume C:\temp
'- Type dir /b
'- Look for the little black icon at the top left
'- Choose Edit | Mark. You can now select your files.
'- Choose Edit | Copy
'- Go to Excel and start up a new workbook and select A1
'- Hit Paste

'Now suppose your file name is something like: Fortitude.S01E01.WEB-DL.XviD-FUM.jpg
'and you want to replace the part "WEB-DL.XviD-FUM" with "IMG_" (without quotes.)
'- Go to B1 and enter formula =SUBSTITUTE(A1;"WEB-DL.XviD-FUM.jpg";"IMG_.jpg") Attention, I use semi colon and not comma because I have Dutch version.
'- Copy down
'- Now you have your correct file names in B1
'- Copy and Paste this code in a new module -> Alt+F11 | Insert | Module
'- Run the code with View | Macros |View macros | RenameFiles | Run
'- it will pause and you have to point to the directory where your files are.

Sub RenameFiles()
Dim xDir As String
Dim xFile As String
Dim xRow As Long
    
    With Application.FileDialog(msoFileDialogFolderPicker)
        .AllowMultiSelect = False
        If .Show = -1 Then
            xDir = .SelectedItems(1)
            xFile = Dir(xDir & Application.PathSeparator & "*")
            Do Until xFile = ""
                xRow = 0
                On Error Resume Next
                xRow = Application.Match(xFile, Range("A:A"), 0)
                If xRow > 0 Then Name xDir & Application.PathSeparator & xFile As _
                    xDir & Application.PathSeparator & Cells(xRow, "B").Value
                xFile = Dir
            Loop
        End If
    End With
End Sub

Dubbele waarden in kolom markeren

Geplaatst op

In kolom A staan dubbele waarden en in kolom B niet. Bijvoorbeeld in kolom A staan de bedrijfsnamen en in kolom B de adressen. Een bedrijf kan meerdere adressen hebben omdat ze ook nog in een ander land zitten. De bedrijfsnaam kan dus 2 of meerdere keren voorkomen maar het adres niet.

Als de bedrijfsnaam meerdere keren voorkomt in kolom A willen we de hele rij markeren. Zoiets:

Option Explicit
Sub Dubbele_Waarden_In_Kolom_A()
'Start rijnummer van je gegevens.
Const lngStartRij As Long = 2

Dim lngLaatsteRij As Long
Dim rngCell As Range
Dim strGegevens As String

    lngLaatsteRij = Range("A:B").Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
    strGegevens = "A" & lngStartRij & ":A" & lngLaatsteRij
    
    For Each rngCell In Range(strGegevens)
        If Evaluate("COUNTIF(" & strGegevens & ",A" & rngCell.Row & ")") > 1 Then
            'Dubbele waarden in kolom A rood markeren.
            Range("A" & rngCell.Row & ":B" & rngCell.Row).Interior.Color = RGB(191, 255, 128)
        End If
    Next rngCell
End Sub

Bovenstaande code als volgt invoegen:

1. Kopieer de code
2. Open een nieuwe werkmap
3. Druk op de toetscombinatie ALT + F11 om de Visual Basic Editor te openen
4. Druk op de toetscombinatie ALT + N om het menu Invoegen te openen
5. Druk op M om een standaard module in te voegen
6. Daar waar de cursor knippert voeg je de code in middels Ctrl + V
7. Druk op de toetscombinatie ALT + Q om de Editor af te sluiten en terug te keren naar Excel
8. Zorg dat je een lijst met gegevens in je werkblad hebt zoals in de screenshot hierboven.
9. Macro uitvoeren via Beeld | Macro’s

SOM, SOM.ALS, SOMPRODUCT

Geplaatst op

Je kunt tabellen filteren om zodoende bepaalde records te tonen of om totalen te berekenen. Hieronder wat voorbeelden om dat met formules te doen.

We willen telkens het totaal van de kolom Verkoop berekenen.

VOORBEELD 1

Records:
Verhoeven+Hema, Verhoeven+Aldi, Bakema+Hema, Bakema+Aldi

Formule:
=SOMPRODUCT(((A2:A17=”Verhoeven”)+(A2:A17=”Bakema”));((B2:B17=”Hema”)+(B2:B17=”Aldi”));D2:D17)

Resultaat:
€ 440,-

VOORBEELD 2

Records:
Verhoeven+Aldi, Bakema+Aldi

Formule:
=SOMPRODUCT((A2:A17=”Verhoeven”)*(B2:B17=”Aldi”)*(D2:D17))+SOMPRODUCT((A2:A17=”Bakema”)*(B2:B17=”Aldi”)*(D2:D17))

Resultaat:
€ 160,-

VOORBEELD 3

Records: Verhoeven+Hema, Bakema+Aldi

Formule:
=SOM(SOMMEN.ALS(D2:D17;A2:A17;{“Verhoeven”\“Bakema”};B2:B17;{“Hema”\“Aldi”}))

Resultaat:
€ 240,-

Let op: In de formule worden twee matrices (Array) gebruikt namelijk: {“Verhoeven”\“Bakema”} én {“Hema”\“Aldi”}. Een matrix in een formule wordt ingesloten door accolades { } en de onderdelen worden gescheiden door een backslash.

VOORBEELD 4

Records:
Verhoeven+Hema+Limburg, Bakema+Aldi+Limburg

Formule:
=SOM(SOMMEN.ALS(D2:D17;A2:A17;{“Verhoeven”\”Bakema”};B2:B17;{“Hema”\”Aldi”};C2:C17;”Limburg”))
Resultaat:
€ 90,-

VOORBEELD 5

Records: Verhoeven+Hema+Limburg, Verhoeven+Aldi+Limburg, Bakema+Hema+Limburg, Bakema+Aldi+Limburg

Formule:
=SOMPRODUCT(((A2:A17=”Verhoeven”)+(A2:A17=”Bakema”));((B2:B17=”Hema”)+(B2:B17=”Aldi”));–(C2:C17=”Limburg”);D2:D17)

Resultaat: € 240,-

VOORBEELD 6

Records:
Verhoeven+Hema+Limburg, Verhoeven+Aldi+Limburg, Verhoeven+Hema+Utrecht, Verhoeven+Aldi+Utrecht
Bakema+Hema+Limburg, Bakema+Aldi+Limburg, Bakema+Hema+Utrecht, Bakema+Aldi+Utrecht
Polman+Hema+Limburg, Polman+Aldi+Limburg, Polman+Hema+Utrecht, Polman+Aldi+Utrecht

Formule:
=SOMPRODUCT(D2:D17;–ISGETAL(VERGELIJKEN(A2:A17;{“Verhoeven”\”Bakema”\”Polman”};0));–ISGETAL(VERGELIJKEN(B2:B17;{“Hema”\”Aldi”};0));–ISGETAL(VERGELIJKEN(C2:C17;{“Limburg”\”Utrecht”};0)))

Resultaat:
€ 900,-

VOORBEELD 7

Records:
Verhoeven+Hema+Limburg, Verhoeven+Aldi+Limburg, Verhoeven+Hema+Utrecht, Verhoeven+Aldi+Utrecht
Bakema+Hema+Limburg, Bakema+Aldi+Limburg, Bakema+Hema+Utrecht, Bakema+Aldi+Utrecht
Polman+Hema+Limburg, Polman+Aldi+Limburg, Polman+Hema+Utrecht, Polman+Aldi+Utrecht

Formule:
=SOMPRODUCT(D2:D17;–ISGETAL(VERGELIJKEN(A2:A17;$Q$109:$Q$111;0));–ISGETAL(VERGELIJKEN(B2:B17;{“Hema”\”Aldi”};0));–ISGETAL(VERGELIJKEN(C2:C17;{“Limburg”\”Utrecht”};0)))

Resultaat
€ 900,-

Let op: In de formule wordt nu een verwijzing gebruikt. Zie het rode gedeelte. In dat gedeelte kun je namen invullen waardoor de formule flexibeler wordt.

 Q
 Naam
109Polman
110Verhoeven
111Bakema