Just nu i M3-nätverket
Jump to content

Databas i Excel


Axi

Recommended Posts

En vän till mig ville att jag skulle göra en sak i Excel till honom.

 

Han har en liten databas på runt 1000 artiklar, som i dagsläget endast består av artikelnummer, artikelnamn samt antal.

Han ville att jag skulle göra ett "följesedels" formulär, där en användare kan skriva/söka artikelnummer i ruta 1 och då få ifyllt artikelnamn i ruta 2 (som en slags verifiering för att stavningen är korrekt). I den tredje rutan skulle användaren ange hur många (antal) han skickar.

 

När han fyllt i alla artiklar han tänkte skicka, hade jag tänkt koppla ihop det med ett Makro som mailar listan + att makrot skulle dra av kvantiteten som användaren angett från databasen.

 

Påfyllningen av kvantitet skulle min vän ta hand om direkt genom att kontra det mot vad vi skickar till dem. (Dvs utan formulär)

 

Fråga 1: Så, min fråga är egentligen till att börja med om jag ska använda excel eller access till den basen? Access är ju egentligen till för denna typen av dataanvändning, men jag kan inte access alls. Jag har börjar peta lite på programmet nu, men jag är lite trögstartad. Jag måste förstå hur deras formulär fungerar och dylikt för att kunna använda det.

Det känns osäkert att lägga en dylik databaslista i excel eftersom excel är så dynamiskt, men å andra sidan så är jag mer hemvan vid Excel.

 

Fråga 2: Är det någon som kan föreslå hur jag skulle kunna lägga upp ett makro för Följesedelns funktion när det gäller att dra av antal från en annan cell? Det kanske blir uppemot tjugo åt gången i värsta fall. Det bästa är om Makrot dessutom hade skickat en fil som inte är .xls Kanske en .txt eller .html fil? Lite grand som en motsvarighet till rapport i access?

Jag hade tänkt koppla allt mot en knapp som dessutom skapar ett ID för följesedeln. Detta är inga svårigheter och om ID redan är skapat så kan inte samma följesedel skickas igen. En liten säkerhet för att undvika oavsiktliga dubbelklick på makroknappen.

Följesedel.xlsx

Link to comment
Share on other sites

Mr Andersson

En vän till mig ville att jag skulle göra en sak i Excel till honom.

 

Han har en liten databas på runt 1000 artiklar, som i dagsläget endast består av artikelnummer, artikelnamn samt antal.

Han ville att jag skulle göra ett "följesedels" formulär, där en användare kan skriva/söka artikelnummer i ruta 1 och då få ifyllt artikelnamn i ruta 2 (som en slags verifiering för att stavningen är korrekt). I den tredje rutan skulle användaren ange hur många (antal) han skickar.

 

När han fyllt i alla artiklar han tänkte skicka, hade jag tänkt koppla ihop det med ett Makro som mailar listan + att makrot skulle dra av kvantiteten som användaren angett från databasen.

 

Påfyllningen av kvantitet skulle min vän ta hand om direkt genom att kontra det mot vad vi skickar till dem. (Dvs utan formulär)

 

Fråga 1: Så, min fråga är egentligen till att börja med om jag ska använda excel eller access till den basen? Access är ju egentligen till för denna typen av dataanvändning, men jag kan inte access alls. Jag har börjar peta lite på programmet nu, men jag är lite trögstartad. Jag måste förstå hur deras formulär fungerar och dylikt för att kunna använda det.

Det känns osäkert att lägga en dylik databaslista i excel eftersom excel är så dynamiskt, men å andra sidan så är jag mer hemvan vid Excel.

 

Fråga 2: Är det någon som kan föreslå hur jag skulle kunna lägga upp ett makro för Följesedelns funktion när det gäller att dra av antal från en annan cell? Det kanske blir uppemot tjugo åt gången i värsta fall. Det bästa är om Makrot dessutom hade skickat en fil som inte är .xls Kanske en .txt eller .html fil? Lite grand som en motsvarighet till rapport i access?

Jag hade tänkt koppla allt mot en knapp som dessutom skapar ett ID för följesedeln. Detta är inga svårigheter och om ID redan är skapat så kan inte samma följesedel skickas igen. En liten säkerhet för att undvika oavsiktliga dubbelklick på makroknappen.

 

Excel är, som du är inne på, inget databasprogram även om man kan göra enklare databasliknande funktioner i det.

 

Access är det givna valet. Den tid du behöver lägger i Excel för att få rätt på allt med hjälp av VBA, kan du lägga på att lära dig Access i stället.

 

Grunden är att man göra olika tabeller som man ser relaterar till varandra med frågor. Dessa frågor (och även tabeller för den delen) använder man sen i formulär och rapporter.

 

När man jobbar med formulär så jobbar man även med underformulär. Tex, du har en följesedel med kundens namn och andra uppgifter som gäller följesedeln, sen har du ett underformulär som visar vad kunden beställt, rad för rad.

Link to comment
Share on other sites

Jag säger som Mr Andersson. Det är fullt möjligt att göra detta i Excel men samtidigt är det en utomordentligt anledning till att lära sig hantera en databas.

 

Å andra sidan kan man lägga upp tabellerna likt i en databas initialt för att senare flytta dem till en databas.

 

Fråga 2:

Mmh...Om du går till Access skulle jag tro att den rapportfunktionen kan ligga där men vill du ha det i Excel (och jag jobbar helt i Excel) kan man tänka som såhär:

 

1: Man börjar med en grund där formler hämtar alla data som ska hämtas. Det vill säga att användaren väljer objekt, ett ID-skrivs in och formler hämtar resten av data om objektet. Då vet alltså formlerna vilken rad, vilket objekt det är som används.

 

2: VBA-kod initieras av användaren när följesedeln avslutas. Här finns två vägar att gå. Ena vägen är spårbar, reversibel, och andra är direkt. Spårbart blir det om alla följesedlar, allt de innehåller, sparar i en tabell (!) och saldo räknas utifrån hur mycket som funnits i lager en given dag och hur mycket som har sänts ut efter det.

Om man väljer icke spårbart, då går man in i tabellen med saldo direkt och ändrar värdet där.

 

ja, som du märker, det låter som en databas än.

 

Spara i annat format? Inget problem alls i Excel. Text, csv, html? allt går. Skicka? Som e-post? Inget problem det heller.

 

Tänk igenom hur du vill göra så tar vi det med att skicka senare.

Link to comment
Share on other sites

Tja. Koden för att Maila har jag redan.

 

Sub Mail_ActiveSheet()
'Working in 97-2007
   Dim FileExtStr As String
   Dim FileFormatNum As Long
   Dim Sourcewb As Workbook
   Dim Destwb As Workbook
   Dim TempFilePath As String
   Dim TempFileName As String

   With Application
       .ScreenUpdating = False
       .EnableEvents = False
   End With

   Set Sourcewb = ActiveWorkbook

   'Copy the sheet to a new workbook
   ActiveSheet.Copy
   Set Destwb = ActiveWorkbook

   'Determine the Excel version and file extension/format
   With Destwb
       If Val(Application.Version) < 12 Then
           FileExtStr = ".csv ": FileFormat = xlCSV
       Else
           If Sourcewb.Name = .Name Then
               With Application
                   .ScreenUpdating = True
                   .EnableEvents = True
               End With
               MsgBox "Your answer is NO in the security dialog"
               Exit Sub
           Else


           End If
       End If
   End With

   '    'Change all cells in the worksheet to values if you want
       With Destwb.Sheets(1).UsedRange
           .Cells.Copy
           .Cells.PasteSpecial xlPasteValues
           .Cells(1).Select
       End With
       Application.CutCopyMode = False

   'Save the new workbook/Mail it/Delete it
   TempFilePath = Environ$("temp") & "\"
   TempFileName = "Följesedel " & Format(Now, "dd-mmm-yy hhmmss")

   With Destwb
       .SaveAs TempFilePath & TempFileName & FileExtStr, _
               FileFormat:=xlCSV

       On Error Resume Next
       .SendMail "axi@mail.se", _
                 "Följesedel " & Format(Now, "dd-mmm-yy hhmmss")

       On Error GoTo 0
       .Close SaveChanges:=False
   End With

   'Delete the file you have send
   Kill TempFilePath & TempFileName & FileExtStr

   With Application
       .ScreenUpdating = True
       .EnableEvents = True
   End With
End Sub

 

Den kommer från http://www.mrexcel.com/forum/showthread.php?p=2308930 från början men jag har moddat den lite eftersom jag inte vill ha frågor och jag vet vilken version användaren kör med.

 

Din idé angående att bara "lägga till" den som ska dras av är superb. Blir det fel är det lätt att se när och vad. Jag kommer dock behöva lite hjälp med koden för det.

 

Jag har moddat min bifogade fil lite för att passa in på det vi pratar om nu. I blad2 har jag staplat upp:

Kol1: Art nr

Kol2: Art namn

Kol3: Aktuellt antal

kol4>: Modifikation till aktuellt antal.

 

I kol4 rad 1 valde jag att ge plats för en NU() stämpel som kan skriva in var gång man skickar en följesedel.

 

En funktion som jag nämde i första posten som är rätt viktigt är "sök" funktionen. Jag vet inte om du har något bra tips för det monshi. Det hade varit jättebra om användaren hade kunnat skriva en liten bit av ett artikelnummer och få 'förslag' på passande artiklar. Man kan ju använda "dataverifiering" för att välja ur lista, men med runt 1000 unika artiklar blir det ganska meningslöst. Tanken är ju att listan ska bli mindre om man anger en del av numret. (som i min exempelfil .tex skriva in 'bord*' och då få förslag på resten som börjar med 'bord'.

 

Den funktionen + funktionen där macrot letar upp i följesedeln inskrivna artiklar, i tabellen och lägger till motsvarande avdrag och en NU() stämpel i första lediga kolumn behöver jag hjälp med.

En annan god idé kan ju vara att om användaren anger negativt värde i 'följsedeln' så kommer makrot addera istället. Kan vara en smart funktion i de fall där användaren råkat ange fel artikel t.ex?

 

Edit: Glömde bifoga den nya filen

Edit2: Jag skrev ihop en liten funktion som man kan använda istället för NU(). Denna funktionen hindrar tom dubbelklick under samma sekund:

 

=TEXT(NOW();"ÅÅMMDD-TTMMSS-")&(RIGHT(RAND();2)*1)

Resultatet blir typ såhär: 100524-164719-87 där de två sista sista sifforna är random.

Följesedel.xlsx

Link to comment
Share on other sites

Ok, jag har försökt med att få rätt på koden som letar och klistrar in data nu i flera timmar, men jag bli förvirrad av de olika metoderna, med resultatet att jag blandar ihop det och kladdar till det. :-(

 

Rent krasst så behöver jag det här:

 

Två olika blad "sedel" och "bas"

I "sedel" kolumn A finns artikelnummer. Sökvärdet

I "sedel" kolumn D finns antal. Källvärde

I "bas" kolumn A finns en längre lista (1000) med artikelnummer.

Varje gång makrot körs, skrivs datum in i "Bas" första lediga kolumn på rad1 (rubrikraden) Mål

 

Det jag vill är att koden letar efter sökvärdet i "bas" och när den hittat rätt, ska den kopiera in källvärdet på rätt rad i den kolumnen den precis skrivit in datum i (sista använda).

 

Se gärna min excel fil lite högre upp för hur jag lagt upp det hela.

 

Jag har blivit lärd att "find" är mycket snabbare än t.ex en "for each" loop och det kan bli ett par celler att kolla i om den ska leta efter 25 olika värden i 1000 celler var.

 

Kan någon hjälpa mig?

 

Edit; Ser nu att "sedel" motsvaras av "blad1" & "bas" av "blad2" i min fil i föregående inlägg. Bara så vi eliminerar onödig förvirring. ;-)

Link to comment
Share on other sites

Jag kom på att jag kanske skulle skriva vad jag kommit fram till i denna frågan så att andra kanske kan bli hjälpta av denna tråden med.

 

Public LastCol As Integer

Sub main()
Call packageslip
Call findandmove
'Call Mail_ActiveSheet'
End Sub

Sub packageslip()

   With Worksheets("bas")
       LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
   End With

Worksheets("bas").Cells(1, LastCol + 1) = Worksheets("bas").Cells(1, 4).Value
Worksheets("sedel").Cells(2, 4) = Worksheets("bas").Cells(1, 4).Value

End Sub

Sub findandmove()
Dim artNO As Range
Dim valNO As Range
Dim refRange As Range
Dim targRange As Range
Dim fCell As Range
Dim lcell As Range


Set artNO = Worksheets("sedel").Cells(5, 1)
Set valNO = Worksheets("sedel").Cells(5, 1).Offset(0, 2)

Set refRange = Sheets("sedel").Range("a5:a25")
Set targRange = Sheets("bas").Range("a2:a1500")

For Each lcell In refRange
With targRange
Set fCell = .Columns(1).Find(What:=artNO, After:=.Cells(2, 1), LookIn:=xlValues, LookAt:= _
       xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
       , SearchFormat:=False)
On Error GoTo 0

If Not fCell Is Nothing Then fCell.Offset(0, LastCol) = valNO

Set artNO = artNO.Offset(1, 0)
Set valNO = valNO.Offset(1, 0)
End With
Next lcell

End Sub

 

Detta fungerar bra för mig. Jag har lagt min datum+random funktion i cell Worksheets("bas").Cells(1, 4).Value. Kanske kan man bygga in den i makrot direkt. Jag har för mig jag fick lite problem när jag försökte sist eftersom det är funktioner som bygger på varandra:

=TEXT(NOW();"ÅÅMMDD-TTMMSS-")&(RIGHT(RAND();2)*1)

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...