Excel VSTO

Det har naturligvis været rigtig godt, at kunne gennemgå kursus i sit eget tempo, hvilket har betydet meget for mig, da jeg så har kunne få det daglige arbejde til at passe ind.

I modsætning til en traditionel undervisningsform, hvor kurset er berammet til en fast tid og man derfor bliver nødt til, at sætte en tidsgrænse for de praktiske opgaver, har jeg kunne nørde lige så længe jeg vil, og dermed afprøve nogle flere teknikker, end der normalt er tid til.

Ved at køre kurset over flere uger, har jeg også haft tid til, at lade de nye informationer bundfælde og sætte sig bedre fast.

En rigtigt god ting har været, at jeg har kørt hele kurset på min egen (firmaet) maskine, med min egen opsætning. Har alt for ofte været på kurser ude af huset, på andre maskiner og når man så kom tilbage til ens egen pc, var det en anden opsætning, en anden version, eller andet der gjorde, at man ikke lige kunne komme igang med det man havde lært.

Jeg har kunne bruge mine hverdagsopgaver som opgaverne i kurset, hvilket jeg syntes er bedere end de normale "Hello World" opgaver.

Og så er jeg meget imponeret over den hurtige response der har været på indsendte opgaver og spørgsmål. Dejligt at jeg ikke skulle vente dage med, at kunne komme videre, men ofte i løbet af minutter eller timer.

Jan Amdi Letvad, PFA Pension

Excel VBA

Godt med muligheden for sparring med underviser og forslag til andre løsningsmetoder end mine egne - selvom mine også fungerede.

Godt med muligheden for ingen tidsbegræsning for kurset. Havde jeg - pga. arb. situation, brug for.

Anja Hansen, TDC

Excel VBA

Det har været godt at selv kunne bestemme farten, samt bruge al den tid man nu selv synes for at lave opgaverne.

Det har været et hårdt kursus, men jeg har virkelig lært meget og er mere rustet til at lave nye makroer, hvor jeg så selv kan gå i i VBA og lave rettelser, fordi jeg kan forstå programmet.

Margit Gravgaard Larsen, Novo Nordisk A/S

Access VBA

Rigtig god og hurtig respons fra underviser. Skal ikke vente ret lang tid på at få et svar på en problemstilling og spørger man efter en uddybning til eksempelvis en kode, kommer der hurtigt et svar, så man kan komme videre. Har fornemmelsen hele vejen igennem at underviser er villig at bruge den nødvendige tid på en, så man kan få løst opgaven. Bliver tvunget til at arbejde med opgaven, der er ikke nogen nem genvej, hvilket er rigtig godt.

Brian Lind Olsen, OUH Odense Universitetshospital

Excel VBA

Det er rart at kunne tage kurset i sit eget tempo, når det lige passer ind, men det giver også en risiko for at det lige bliver langstrækt nok, men så er det godt underviseren kan holde én lidt i ørerne med mails wink

Eva Bonne Alkærsig, EBA InterrimControlling

Excel VBA

At jeg kan fordybe når jeg har tid og lyst, er super.

Virkelig hurtig respons fra underviseren - næsten døgnet rundt :)

Øvelserne indeholdt hvad jeg skulle bruge, for at komme videre med egne vba-projekter.

At man kunne sammenligne egne løsninger med underviserens var lærerigt.

Henrik Boss, Marel Bornholm

< >
Se flere referencer

Programmering af dialog/form

Der er jo ikke meget fidus ved sådan en dialog uden noget kode, der kan håndtere det brugerne skriver i formen og måske også gøre lidt når formen åbner.

Der er 3 ting vi skal have kigget på

  1. Initialisering (ting der skal gøres når formen åbnes)
  2. Validering (så, vi med det samme kan give brugeren feedback, hvis der skrives noget vrøvl)
  3. Afslutning (aflevering af data fra formen i regnearket)

Initialisering

For at få fat i de hændelser der er knyttet til en dialog skal man først sørge for at det er dialogen, der er markeret. Dernæst ud til højre i Visual Studio i Properties vinduet og klikke på lynet. Man kan så se alle de hændelser, der er knyttet til selve dialogen.

Den vi skal have fat i her hedder Load. Dobbeltklik i det hvide felt for at komme ind til koden bag.

Dialog hændelser

Så skal du gerne få en tom Load hændelse:

private void Salgsform_Load(object sender, EventArgs e)
{

}

Og du kan kaste dig over programmeringen:

private void Salgsform_Load(object sender, EventArgs e)
{
  Saelger.Items.Add("Vælg sælger");
  Saelger.Items.Add("Thor");
  Saelger.Items.Add("Jens");
  Saelger.Items.Add("Peter");
  Saelger.SelectedIndex = 0;
  Produktgruppe.Items.Add("Vælg produktgruppe");
  Produktgruppe.Items.Add("PC");
  Produktgruppe.Items.Add("Skærm");
  Produktgruppe.Items.Add("Bærbar");
  Produktgruppe.SelectedIndex = 0;
  FakturaNummer.Text = "Skriv fakturanummer";
  StkPris.Text = "0";
  Antal.Text = "1";
  Post.Checked = true;
}

Jeg håber ikke ovenstående indeholder den store overraskelse - vi tilføjer elementer til de to combobokse og angiver, at det første element skal være valgt.
Dernæst sætter vi tekst på Fakturanummer, StkPris og Antal boksene. Og endelig sørger vi for at Post knappen er trykket ind.

Der er helt sikkert en masse andet du også kunne tænke dig at gøre - f.eks. at hente sælgere eller produktgrupper fra lister i regnearket - men det må lige vente lidt. Vi kommer tilbage til det senere i kurset.

Validering

Lad os se på, hvordan vi får sikret, at brugeren faktisk skriver et tal i f.eks. StkPris feltet. Vi skal igen have fat i hændelserne i properties vinduet.

Sørg for at StkPris tekstboksen er markeret og klik på lynet ude i Properties vinduet ude til højre:

Hændelser til tekstboks

Og som du ser er der en Validating hændelse, der kaldes når indholdet i tekstboksen er klar til at blive valideret.

Dobbeltklik i det hvide felt, så du kommer ind til hændelseskoden:

private void StkPris_Validating(object sender, CancelEventArgs e)
{
}

Og vi kan skrive vores kode. Den kan se sådan her ud:

private void StkPris_Validating(object sender, CancelEventArgs e)
{
  float pris;
  if (!float.TryParse(StkPris.Text, out pris))
  {
    MessageBox.Show("Du må meget gerne skrive et tal");
    e.Cancel = true;
  }
}

Det er måske ikke helt simpelt at forstå. Lad os tage det linje for linje.

  1. Vi laver en variabel, som vi kalder pris med datatypen float (et kommatal)
  2. TryParse prøver at konvertere den tekst, der står i StkPris.Text. Med out pris fortæller vi, at hvis det går godt vil vi gerne have tallet ud i vores variabel. Selve TryParse returnerer true eller false afhængig af om det er gået godt eller skidt. Det betyder at !float.TryParse er sand, hvis det er gået galt og ellers falsk. Altså, vi kommer kun ind i if sætningen, hvis det er gået galt.
  3. Og, hvis det er gået galt viser vi en beskedboks til brugeren
  4. Og med e.Cancel = true fortæller vi, at brugeren skal "blive" i tekstboksen. e kommer med som parameter til proceduren.

Håber det nu giver lidt mere mening :)

Afslutning

Nu mangler vi "bare" at skrive lidt kode til de to knapper.

Den første er simpel - har skal vi "bare" lukke dialogen uden at gøre mere. Dobbelklik på knappen for at komme ind til koden og der kan du så skrive

private void Fortryd_Click(object sender, EventArgs e)
{
  this.Close();
}

this er en reference til formen selv - svarende til Me i VBA.

Opret knappen er lidt mere kompliceret og afhængerer naturligvis af, hvad informationerne skal bruges til.

Vi har sådan set allerede set, hvordan man skriver informationer ud i regnearket, så vi gøre "bare" på samme måde. Start med at dobbeltklikke på knappen for at komme ind til koden. Og der kan du så skrive:

private void Opret_Click(object sender, EventArgs e)
{
  Excel.Worksheet wks = 
       (Excel.Worksheet)Globals.ThisWorkbook.ActiveSheet;
  wks.Range["A1"].Value2 = FakturaNummer.Text;
  wks.Range["B1"].Value2 = Dato.Value;
  wks.Range["C1"].Value2 = Saelger.Text;
  wks.Range["D1"].Value2 = Produktgruppe.Text;
  wks.Range["E1"].Value2 = StkPris.Text;
  wks.Range["F1"].Value2 = Antal.Text;
  if (Faktureret.Checked)
    wks.Range["G1"].Value2 = "Faktueret";
  else
    wks.Range["G1"].Value2 = "Ikke faktuereret";
  if (Post.Checked)
    wks.Range["H1"].Value2 = "Leveret med post";
  if (Bud.Checked)
    wks.Range["H1"].Value2 = "Leveret med bud";
   this.Close();
 }

Åh jo, og naturligvis også

using Excel = Microsoft.Office.Interop.Excel;

I toppen af koden, så du har adgang til Excel objektsamlingen.

Og igen, er der helt sikkert 1.000 andre ting du også godt kunne tænke dig at gøre med informationerne - f.eks. levere dem i bunden af en tabel mv.

Det skal vi nok komme tilbage til - vi skal lige lære lidt mere Excel C# kode først.

Når du har betalt for kurset får du adgang til øvelser til hver lektion. Og når du har fået godkendt din besvarelse får du desuden adgang til mine løsningsforslag med ekstra tips og trix.