Förstå RANGE i Excel

Nivå: Avancerad

(Till detta exempel finns en Excelarbetsbok med programkod att ladda ner för den som vill fördjupa sig. ) När man arbetar med Excel och utvecklar egna makron är objetet RANGE grundläggande i Excel. Man kan förstå RANGE som att det är ett område av celler i ett kalkylark som ges ett namn. När man väl förstått hur RANGE fungerar och hur man kan använda det, öppnas en helt ny värld av möjligheter och lösningar.

I detta exempel antar vi följande:
Vi skall leta efter en speciell egenskap i ett definierat område med celler (…ett Range!).  Vi har två kolumner på ett Excelark, kolumnen Produkt, och kolumnen Pris. Antag nu att vi vill leta efter alla som har egenskapen Produkt A i arket. När vi hittar Produkt A, vill vi att priset skall markeras och bli rött. Vi vill också att programmet skall tala om för oss hur många Produkt A det fanns i prislistan. Som grädde på moset så lägger vi till hur lång tid det tog för  Excel att utföra proceduren att räkna igenom det hela.

Här är ett förslag till lösning:
Förberedelser: Innan vi börjar programmera i Excel, definierar vi två områden(=RANGE) där vi skall leta. Det ena området med celler kallar vi Produkt, det andra området kallar vi Pris. Namnområdet skapas genom att det defineras från menyraden i Excel, under, Infoga – > Namn – > Definiera.  Vi har nu definerat två s.k. range,  Produkt och Pris. Nu är det dags att skriva programkoden i Excel.

Infoga en ny modul i Visual Basic Editor (gå in VBE med Alt+F11, eller från menyraden i Excel). Nu skrivs följande programkod in:

Sub SkapaProduktAFält()

Worksheets(”sp_pris”).Activate
Dim t As Double
Dim i As Long, j As Long
t = Timer
Dim rngProdukt As Range
Dim rngPris As Range
Dim Raknare As Long
Dim ranknare1 As Long

’Definerar upp kolumen för Produkt-kolumnen…
Set rngProdukt = Range(”Produkt”)

’Definerar upp kolumen för Pris-kolumnen…
Set rngPris = Range(”Pris”)
Raknare = 0
raknare1 = 0

’Här utförs loopen där vi letar efter egenskapen,

For i = 1 To rngProdukt.Rows.Count
    For j = 1 To rngProdukt.Columns.Count
        If rngProdukt.Cells(i, j).Value = ”Produkt A” Then
        rngPris.Cells(i).Font.ColorIndex = 3
        Raknare = Raknare + 1
    Else
    raknare1 = raknare1 + 1
    End If
Next j
Next i
MsgBox ”På ” & Timer – t & ” sek. hittade jag totalt ” & Raknare & ” celler med egenskapen.”
MsgBox ”…och ” & raknare1 & ” celler hade INTE egenskapen”

 

’Radera och förstår objekten…
Set rngProdukt = Nothing
Set rngPris = Nothing

End Sub

Kommentar:  När vi letar efter Produkt A i vårt kalkylark, så använder vi en For…next loop. Främsta skälet är att den har en inbyggd räknare som håller koll på hur många gånger den skall utföra uttrycket och leta igenom raderna efter Produkt A.  Vad den gör är att den letar upp den sista cellen i området (range) och börjar leta sig uppåt. Ett annat skäl till att använda For…next lopp är man inte alltid vet hur många gånger programkoden skall loopa igenom och leta efter Produkt A i kalkylarket. Prislistan kan ju uppdateras,  nya produkter kan tillkomma, och gamla kan tas bort osv.

Du kan ladda ner detta Excelexempel och testa på din egen dator dator.  Ladda ner  Excelboken här:

Share

Blockera störande reklam när du surfar

Nivå: Avancerat tips

Vet inte hur det är med dig, men jag störs av alla reklambanners etc. som visas i min webbläsare när jag surfar på alla sajter.  Här är ett smart tips på hur man enkelt blockerar irreterande reklam från sajter du besöker. Hemligheten ligger i att man editerar hostfilen på datorn. OBS! Jag vill varna dig från att detta kräver att du verkligen vet vad du gör, eftersom du mixtrar i ditt registry och ett misstag kan få förödande konsekvenser för din dator! Klicka här och läs mer hur du gör.

Share

Hämta data från Internet direkt till ett Excelkalkylark

Nivå: Medelsvår

Med Excels QueryTables kan man bygga applikationer som hämtar data från en specifik plats på Internet, rakt ner till en arbetsbok i Excel. Antag t.ex. att du skulle vilja ha en arbetsbok i Excel där du samlar aktuella boräntor. Det första vi måste ta reda på är vilka tjänster på nätet som vi kan använda oss av. Eftersom jag är en “text-tv fantast” så har den statliga televisionen (självklart finns det kommersiella alternativ:) lagt ut text-tv utlagd på Internet.

Vad sägs om att ha ett makro som automatiskt går ut på Internet och hämtar ner aktuella boräntor, direkt till en Excelarbetsbok? Vi försöker skapa ett makro som gör detta! Nedan visar jag principen för hur ett sådant makro kan se ut:

Sidan vi skall hämta data ifrån

För att förstå stegen i makrot föreslår jag att vi först besöker SVT-text, med aktuella boräntor och den sida där t.ex Nordea’s boräntor presenteras. Klicka här för att se hur den sidan ser ut. Väl på sidan kan vi notera följande. Nordeas boräntor presenteras på sidan nummer 3 av totalt 5 sidor. (Tittar man högst upp till höger, kan man se att varje sida är numrerad. I detta fall skrivs den sida vi är intresserade av som 3(5)). Denna information, dvs. vilken tabell webbsidan med våra data har, skall vi notera. Den skall vi använda i vår kommande programmering.

Projektet

Koden vi lägger in vårt Excel-makro ser i sin helhet ut på följande sätt:

Sub aktiekurs()

Range(”A1:A9″).Select

 Selection.Cut

    Application.CutCopyMode = False

    Selection.EntireColumn.Insert

‘Hämta data från SVT-Text

Set shfirstqtr = Workbooks(1).Worksheets(1)

Set qtqtrresults = shfirstqtr.QueryTables _

    .Add(Connection:=”URL; http://svt.se/svttext/web/pages/232.html”, _

    Destination:=shfirstqtr.Cells(1, 1))

With qtqtrresults

    .WebFormatting = xlAlternateArraySeparator ‘ xlAllTables

    .WebSelectionType = xlSpecifiedTables

    ‘Hämta data från exempelvis Nordeas tabell – sidan 3 på Text-TV

    .WebTables = “3″

    .Refresh

End With

Range(”A4″).Select

    Selection.Delete Shift:=xlUp

Range(”A10:B22″).Select

    Selection.Delete Shift:=xlToLeft

‘Formatera Rubrik…Grön och Gul.

Range(”A4″).Select

    With Selection.Interior

        .ColorIndex = 50

        .Pattern = xlSolid

        .PatternColorIndex = xlAutomatic

    End With

Range(”A5″).Select

    With Selection.Interior

        .ColorIndex = 6

        .Pattern = xlSolid

        .PatternColorIndex = xlAutomatic

    End With

‘Formatera typsnitt…

Range(”A1:A23″).Select

    With Selection.Font

        .Name = “Courier New”

        .Size = 10

        .Strikethrough = False

        .Superscript = False

        .Subscript = False

        .OutlineFont = False

        .Shadow = False

        .Underline = xlUnderlineStyleNone

        .ColorIndex = xlAutomatic

    End With

 

End Sub

Några kommentarer till vba-koden i Excel ovan:

I den första delen sätter vi in en ny kolumn i vårt kalkylark. I den andra delen, som börjar under kommentaren, Hämta data från SVT-Text, kan vi notera att vi instansierar objekten vi skall använda. Principen för programmeringen är fölande:

 1. Först talar vi om vart, vi skall hämta våra data ifrån. Lägg märke till att vi instansierar QueryTables samt att vi talar om från vilken sida data skall hämtas. Data skall hämtas från den URL-adressen som står beskriven till Nordeas SVT-textsidor.

2. I den andra delen måste vi tala om var någonstans på SVT-textsidan vi skall hämta våra data. Vi definierar att våra data med boräntor finns i en tabell på SVT-textsidan, och att denna tabell med data har nummer 3. Detta är i princip den viktigaste koden för att hämta data till kalkylarket.

3. Resterande kod är egentligen valfritt. Koden handlar om olika typer av formateringar som vi vill att sidan skall ha när data väl finns på kalkylarket. Här kan du experimenterar mer med layouten än vad jag har gjort i detta exempel.

 Kommentar: Querytables är ett mycket kraftfullt sätt att hämta ner data från Internet till en arbetsbok i Excel.

Du kan ladde ner exemplet ovan och testa mer på egen hand!

 

Ladda ner:  webquery

Share

Script som snabbt ger en anslutningssträng

Nivå: Medelsvår

Att ansluta sin applikation till en databas är en vanlig företeelse idag. Ibland kan det var knivigt att veta exakt hur själva anslutningen ser ut. 

Här kommer ett tips om hur du snabbt hittar koden för en anslutningssträng till en databas. Databasen ska vara registrerad på din dator.  Vi skapar ett VBS-script som hjälper oss med detta.  Gör så här:

Öppna Anteckningar i Windows (eller någon annan texteditor).  Kopiera in följande kod:

========= Skriptkodstart ==============

Dim oDataLinks, sRetVal
Set oDataLinks = CreateObject( “DataLinks” )
sRetVal = oDataLinks.PromptNew
On Error GoTo 0
If Not IsEmpty(sRetVal) Then
InputBox “Din anslutningssträng är listad nedan.”, _
    “OlEDB Connection String”, sRetVal
End If
Set oDataLinks = Nothing

========= Skripkodslut ==============

Spara nu dokumentet med filextensionen .vbs,  t.ex oledbconnstring.vbseller hitta på något annat passande filnamn.  Testa och kör skriptet genom att dubbelklicka filen.

Share

Låt Word automatiskt skriva dina rapporter med data från ACCESS

Nivå: Avancerad

Kommentar:  Detta tips är för dig som är avancerade användare och behärskar programmering i Visual Basic 6 . Du bör ha kännedom om Data Access Object (DAO) version 3.6 för att hänga med!:)

Inledning

Microsft Word kan inte bara traditionell ordbehandling, utan det är ett mycket kraftfullt verktyg för att använda som en rapportgenerator,  t.ex hämta data från databaser som läggs i ett dokument.  Tänk dig följande scenario:

Din chef vill ha den veckovisa rapporten över lagertillgångar i företaget som ett färdigt Worddokument,  så att han/hon enkelt kan lägga  dokumentet  som en bilaga till nästa möteshandlingar.  Tänk dig om du kunde göra följande: tillverka ett program som automatiskt skriver ett Word-dokument, innehållandes de senaste datauppgifterna från företagets lagerdatabas, utan att du behöver knappa in en endaste rad med text manuellt. Vi antar nu att chefen dessutom är en stressad person, som inte kan lika mycket PC och Word som du, så det måste vara enkelt.  Chefen vill helst inte knappa på tangentbordet, utan endast göra några få musklick, sedan skall rapporten vara  färdig.  Den goda nyheten är att vi kan tillverka ett sådant program! Ett sätt är att programmera Word!  Nedan visas ett exempel på hur man tillverkar ett kraftfullt program i Word. När man finlirat färdigt och fått applikationen att göra det man vill, kan man enkelt konvertera applikationen som en Wordmall (*.dot), som du kommer åt när du ska skapa ett nytt dokument.

Projektet 

Vi startar Word på vanligt sätt och går in Visual Basic Editor (Alt+F11). Vi lägger ut ett formulär från verktygslådan i VBE. Formuläret ska nu innehålla följande kontroller:

  • Commondialog,
  • ListBox,
  • två stycken Kommandoknappar
  • två stycken Label

I detta exempel används DAO (Data Access Object). Därför måste referensen sättas i Visual Basic Editor till Microsoft DAO 3.6 Object, annars kommer det inte att fungera.

Händelseförlopp

Än så länge har vi inte lagt in någon programkod och inget händer om vi skulle starta vår applikation. Vi ser endast vårt formulär. Nu vill vi att följande skall hända i vårt program:

  1.  När användaren startar applikationen skall formuläret synas. Det första användaren skall göra är att välja en databas. Valet görs av att användaren får upp en dialogruta (kontrollen Commondialog).
  2.  När användaren valt databas, skall databasens samtliga frågor visas i Listboxen på formuläret.
  3.  Användaren väljer sedan en Fråga som finns i Listboxen. Applikationen läser alla tillgängliga frågor i Access, som användaren pekar på. Valet görs genom att användaren klickar på frågan som ska köras. Ett kontrollmeddelande skickas till användaren om frågan verkligen skall köras och om han vill fortsätta.
  4. Användaren klickar t.ex Frågan sp_pris. Data hämtas från databasen och data returneras och skrivs direkt till Worddokumentet.
  5. Klart! Vi har en nu databasrapport som är skriven automatiskt och formaterad i ett Worddokument, utan att vi rört tangentbordet och skrivet ett enda tecken från tangentbordet!

Kommentar

Genom att bygga en generell rapportgenerator i Word, som kan anropa Frågor i databaser som t.ex ACCESS, SQL etc. kan man fokusera sig mer på att tillverka frågor som beskriver de data man vill visa för användaren. Användaren kan därefter få data tillgängligt till Word i snygga rapporter som blir “rätt” varje gång de körs.

Resurser

  • Hämta programkoden till artikeln som pdf-dokument. Klicka här  WordVBA
  • Jag har lagt upp ett Youtube klipp där du kan se en presentation hur  applikationen fungerar (för Youtube-klippet, klicka här)
  • Referens DAO Language Reference, DAO 3.6,  från Microsoft. Se Microsofts hemsida.

Fotnot: Applikationen fungerar med Word 2003, 2007 och Access 2003, 2007. Har ej testat med ”högre” programversioner.

Share