14. november 2000 - 13:44Der er
8 kommentarer og 1 løsning
Åbne Excel + søg
Kan nogen fortælle mig hvordan man på en simpel måde åbner et navngivet Excel regneark (\"lookup.xls\") (arket behøver ikke at blive vist, man skal blot have adgang til data), og søger efter en bestemt værdi i en navngiven søjle. Dernæst skal jeg bruge værdien i den samme række som den fundne men i en anden navngiven søjle.
Eks: Jeg har et regneark i Excel med søjlerne \"nummer\" (=A) og \"ident\" (=D).
Jeg vil lede efter nummer = 5628 i søjlen kaldet \"nummer\" og output skal være værdien der står ud for 5628 men i søjlen kaldet \"ident\" - altså en lookup table.
Hvis man også kunne få celle navne vil det være et plus (f.eks A456, D456 (den sidste giver sig selv i dette tilfælde))
Der skal ikke tages hensyn til at \"5628\" kan optræde flere gange i søjlen \"nummer\".
Som en slags \"kom godt fra start\" stump, prøv følgende
Option Explicit
Function LookUp(ByVal vSearch As Variant) As Variant On Error Resume Next LookUp = Application.WorksheetFunction.VLookup(vSearch, ActiveSheet.Range(\"A1:D2000\"), 4, False) If Err.Number <> 0 Then LookUp = Empty \' do *not* use vbEmpty End If End Function
Sub test() If Not IsEmpty(LookUp(6)) Then MsgBox \"Found!\" Else MsgBox \"Nope!\" End If End Sub
Der er efterhånden mange Excel-spørgsmål i VB kategorien, så det er nogle gange lidt uklart hvorvidt de enkelte spørgsmål går på VBA eller VB. Ovenstående er VBA - altså på godt dansk - koden virker kun indefra Excel.
Derudover bruger jeg luksus-løsningen Application.WorksheetFunction, som allerede indeholder en VLookUp. Til gengæld returnerer den altså ikke nogen informationer om den fundne række. - Så - hvis dette virkeligt er nødvendigt er der kun en Do-While konstruktion tilbage.
Du må give lyd fra dig, hvis du skal have lidt hjælp til dette.
Uh, det skulle helst virke fra VB. Delprojektet er en parser hvor en stor oversættelsestabel findes i et regneark. Men programmet skal køre på nogle maskiner hvor der ikke nødvendigvis findes Excel, så derfor er VBA ikke aktuelt. Nogle dataleverandører har endda Microsoft fobi, så de benytter \"alt andet\" end Microsoft til regneark osv. Der er mulighed for at konvertere tabellen til andet, f.eks. flatfile ren ascii), men det vil nok give en alt for dårlig performance, da vi taler om 10.000+ lookups per parsing-kørsel.
Hele projektet er et datainsamlingsprojekt hvor mange data-leverandører skal sende forskellige kildedata* gennem parseren som skal producere et ensartet produkt, som herefter skal behandles centralt og benyttes til forskellige landsstatistikker (bare lidt baggrundsoplysninger). *leverandørerne ønsker ikke at jeg skal have adgang til rå kildedata, ellers var det nemt nok.
Hvis det ikke er Excel, så skal du jo finde ud af, hvordan du kontrollerer \"det andet regneark\".
Visual Basic har jo ikke direkte mulighed for at gå ind i et hvilket som helst program. Der skal jo lige et par kodestumper til at fortælle den det !!!
Jo, det er jeg jo nok klar over. Grunden til at jeg har valgt excel i første omgang er at data er tilgængelige i dette format (lookup tabellen), og at VB jo fra fødslen kan læse en række formater, også MS, som f.eks. Access. Og det kan jo være man kan lave det med en Data control eller Ado control, det er jeg bare ikke så stiv i. Derfor spørger jeg i dette forum.
Okay - Ren VB på maskiner uden Excel. Det komplicerer sagen en anelse. Som du selv er inde på, kan ADO være en løsning. Vi får dog stadig brug for en Excel-compliant ODBC driver (typisk kaldet ODBCJT.DLL) som skal være installeret på de pågældende PC\'er.
Hvis dette ikke er muligt, er der to alternativer tilbage. Enten kan man implementere en \"Parse Excel Regneark\" algoritme, dvs. vi får brug for BIF-formatet her (eller evt. senere udgaver), som er Excels interne format, eller også kan man benytte den flade ASCII-fil. Sidstnævnte forslag behøver ikke nødvendigvis give en dårlig performance. Ved at indlæse filen i en passende sorteret struktur, evt. kombineret med hashing, kan man hurtigt finde de pågældende entries. Dette er dog lidt for omfattende til at uddybe her.
Jeg tror at ODBC varianten er at foretrække. Men i dette tilfælde kan man vel lige så godt konvertere tabellen til Access 2000 og bruge det som datakilde? Jeg råder over Office Prem, så det er ikke noget problem at lave Access tabellerne. Men som sagt jeg ikke så god til DB programmering i VB - har købt en bog om emnet og kan åbne en DB via Data control men det er vist også nogenlunde så langt jeg er pt. Mht DLL\'erne bliver de vist installeret på klientmaskinen hvis man sørger for at bruge Package and Deployment Wizard der hører til VB. Hvis du kan anvise en let måde at løse problemet vha enten en Excel eller Access datakilde får du pointene, som jeg sætter op til 150.
Hvis der er nogen der kommer med et brugbart forslag (har ikke selv haft tid endnu) så opretter jeg et nyt spm så I kan få points.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.