Avatar billede alen32 Nybegynder
02. december 2005 - 20:51 Der er 40 kommentarer og
2 løsninger

Prøver igen?!

Hej!
Hver måned får jeg en fil med 2 kolonner: i kolonne A er kundens nummer og navn, mens i kolonne B er antal kilo han har købt på en måned.
eks.
A                      B
145623 Jens Jensen    320
Jeg har en anden fil som jeg kalder salgsoversigt hvor jeg har kolonne A med kundens nr., kolonne B med kundens navn og kolonne c - z er antal kilo som kundens har købt fra januar 2004 frem til nu.
A      B            C(jan.04) d(feb.04)
123456  Nils Jensen  245      300  osv.

Jeg har fået her på eksperten nedenstående makro som overfører det antal kilo kunden har købt i denne måned til min salgsoversigt fil dvs programmet finder den samme kunde og i kolonne AA i salgsoversigt filen skriver det antal kilo kunden har købt.

Problemet er at jeg nu har 15 salgsoversigt filer dvs. at hvis kundensnr starter med 15 så skal der overføres til filen salgsoversigt15.xls, hvis kundensnr starter med 16 så skal der overføres til filen salgsoversigt16.xls. Er der nogen der kan hjælpe?



Private Sub CommandButton1_Click()
'Public Sub Exp663895()
    Const sSalesFile As String = "d:\salgsoversigt.xls" 'Skal ændres
    Const sSalesSheetName As String = "Ark1" 'Skal ændres
    ' sCellToWriteIn - Skal ændres hver måned, så der skrives i den
    ' rigtige kolonne det er nødvendigt fordi kolonnen ikke kan findes
    ' automatisk, når ikke der er tal i alle celler.
    Const sCellToWriteIn As String = "Z1"
    Dim wkbNew As Excel.Workbook
    Dim wkbSales As Excel.Workbook
    Dim wksImport As Excel.Worksheet
    Dim wksView As Excel.Worksheet
    Dim lRowFrom As Long
    Dim lRowTo As Long
    Dim bFound As Boolean

    'On Error GoTo CleanUp
    Set wkbNew = ActiveWorkbook
    Set wksImport = wkbNew.ActiveSheet
    Set wkbSales = Application.Workbooks.Open(Filename:=sSalesFile)
    Set wksView = wkbSales.Worksheets(sSalesSheetName)

    ' 2-tallet her bestemmer hvilken række det første kundenr findes i (Update-filen)
    For lRowFrom = 2 To wksImport.UsedRange.Rows.Count
        bFound = False
       
        ' 3-tallet her bestemmer hvilken række det første kundenr findes i (Salgsview-filen)
        For lRowTo = 3 To wksView.UsedRange.Rows.Count

            If Val(wksImport.Cells(lRowFrom, 1).Value) = _
              wksView.Cells(lRowTo, 1).Value Then

                wksView.Cells(lRowTo, wksView.Range(sCellToWriteIn).Column).Value = _
                    wksImport.Cells(lRowFrom, 2).Value
                bFound = True
                Exit For

            End If

        Next lRowTo

        If Not bFound Then
            'Cellen bliver rød, hvis ikke den er overført til opsummeringsarket
            wksImport.Cells(lRowFrom, 1).Interior.ColorIndex = 3
        End If
    Next lRowFrom


CleanUp:
    Set wksImport = Nothing
    Set wksView = Nothing
    Set wkbNew = Nothing
    Set wkbSales = Nothing
'End Sub
End Sub
Avatar billede sjap Praktikant
02. december 2005 - 21:03 #1
Jeg er ikke lige helt sikker på hvor kundenummeret læses i din makro, men du skal bruge noget lignende det her. Nedenstående skal stå efter at du har læst kundenummeret.

StartNr = Left(Format(Kundenr, "0"), 2)
sSalesFile As String = "d:\salgsoversigt" & StartNr & ".xls"

"Kundenr" skal erstattes med en reference til hvor du læser kundenummeret i filen.

Du skal også lige huske at fjerne sSalesFile fra konstantlisten.
Avatar billede alen32 Nybegynder
02. december 2005 - 22:01 #2
Hej!
Kan du hjælpe mig med at skrive At Startnr skal søges i kolonne A
Avatar billede sjap Praktikant
02. december 2005 - 22:06 #3
Står Startnr i en celle for sig selv, eller er den en del af et større tal?
Avatar billede sjap Praktikant
02. december 2005 - 22:09 #4
Kan det være den her du søger?

Left(Format(Val(wksImport.Cells(lRowFrom, 1).Value), "0"), 2)
Avatar billede alen32 Nybegynder
02. december 2005 - 22:13 #5
Startnr er i kolonne A
145623 Jens Jensen   
Det er præcis som du skriver StartNr = Left(Format(Kundenr, "0"), 2) den skal bare søge i kolonne A. og derefter hvis startnr er lige med 14 så skal der åbnes d:\salgsoversigt14.xls
sSalesFile As String = "d:\salgsoversigt" & StartNr & ".xls"
Avatar billede alen32 Nybegynder
02. december 2005 - 22:15 #6
ja noget i den retning men der skal åbnes 15 filer.
Avatar billede sjap Praktikant
02. december 2005 - 22:17 #7
Det forstår jeg ikke. Hvis den finder at startnr er 14, skal den så ikke kun åbne d:\salgsoversigt14.xls?
Avatar billede xvid Seniormester
02. december 2005 - 22:19 #8
nogen der kan hjælpe mig ? http://www.eksperten.dk/spm/669247
Avatar billede alen32 Nybegynder
02. december 2005 - 22:24 #9
Nej!  jeg har tænkt først åbnes salgsoversigt14 opdateres og lukkes og derefer åbnes salgsoversigt 15 osv.
Avatar billede sjap Praktikant
02. december 2005 - 22:30 #10
Nu vej jo ikke hvor store dine filer er, men i princippet kan du jo blot åbne dem alle sammen til at starte på, og så lukke dem, når du er færdig. Det er den enkle metode. Ulempen her er at du måske åbner filer, der ikke skal opdateres.

Så kan du selvfølgelig vælge at lave en løkke, der løber fra 1 til 15, der så starter med at undersøge om Left(Format(Val(wksImport.Cells(lRowFrom, 1).Value), "0"), 2) er lig med det aktulle tal, og så eksekverer resten af koden. Ulmepen her er at du altid skal løbe alle dine data igennem 15 gange.
Avatar billede alen32 Nybegynder
02. december 2005 - 22:39 #11
Har du en bedre ide?
Avatar billede sjap Praktikant
02. december 2005 - 22:59 #12
Nej, lige nu kan jeg ikke komme på andre ideer end de to nævnte.

Hvis dine data er sorteret efter kundenr. kan der laves en udgave af forslag 2, som kun løber data gennem én gang. Er dine data sorteret.

Du kan jo vælge et af forslagene eller vente på, at nogen finder på noget bedre.
Avatar billede alen32 Nybegynder
02. december 2005 - 23:18 #13
ja de er sorteret. Tak for hjælpen. Du for 60 points.
Avatar billede sjap Praktikant
02. december 2005 - 23:24 #14
Fik du løst problemet?
Avatar billede alen32 Nybegynder
03. december 2005 - 00:49 #15
ikke helt. fortsætter imorgen.
Avatar billede alen32 Nybegynder
03. december 2005 - 09:25 #16
Kan du lave en løkke som i forslag 2?
Avatar billede sjap Praktikant
03. december 2005 - 10:20 #17
Det kan jeg godt. Du må dog lige bære over med, at jeg måske ikke har sat mig helt ind i den eksisterende kode, så det er ikke sikkert, at jeg lige rammer ind i den korrekte placering af løkken med det samme.

Private Sub CommandButton1_Click()
    Const sSalesFileN As String = "d:\salgsoversigt"
    Const sSalesSheetName As String = "Ark1" 'Skal ændres
    ' sCellToWriteIn - Skal ændres hver måned, så der skrives i den
    ' rigtige kolonne det er nødvendigt fordi kolonnen ikke kan findes
    ' automatisk, når ikke der er tal i alle celler.
    Const sCellToWriteIn As String = "Z1"
    Dim wkbNew As Excel.Workbook
    Dim wkbSales As Excel.Workbook
    Dim wksImport As Excel.Worksheet
    Dim wksView As Excel.Worksheet
    Dim lRowFrom As Long
    Dim lRowTo As Long
    Dim bFound As Boolean

    'On Error GoTo CleanUp
    Set wkbNew = ActiveWorkbook
    Set wksImport = wkbNew.ActiveSheet

    For FileNo = 1 To 15
        Set wkbSales = Application.Workbooks.Open(FileName:=sSalesFile & FileNo)
        Set wksView = wkbSales.Worksheets(sSalesSheetName)
       
        ' 2-tallet her bestemmer hvilken række det første kundenr findes i (Update-filen)
        For lRowFrom = 2 To wksImport.UsedRange.Rows.Count
            If Left(Format(Val(wksImport.Cells(lRowFrom, 1).Value), "0"), 2) = FileNo Then
                bFound = False
               
                ' 3-tallet her bestemmer hvilken række det første kundenr findes i (Salgsview-filen)
                For lRowTo = 3 To wksView.UsedRange.Rows.Count
       
                    If Val(wksImport.Cells(lRowFrom, 1).Value) = _
                      wksView.Cells(lRowTo, 1).Value Then
       
                        wksView.Cells(lRowTo, wksView.Range(sCellToWriteIn).Column).Value = _
                            wksImport.Cells(lRowFrom, 2).Value
                        bFound = True
                        Exit For
       
                    End If
       
                Next lRowTo
       
                If Not bFound Then
                    'Cellen bliver rød, hvis ikke den er overført til opsummeringsarket
                    wksImport.Cells(lRowFrom, 1).Interior.ColorIndex = 3
                End If
            End If
        Next lRowFrom

        wkbSales.Close savechanges:=True
        Set wksView = Nothing
        Set wkbSales = Nothing
    Next FileNo


CleanUp:
    Set wksImport = Nothing
    Set wkbNew = Nothing
End Sub
Avatar billede alen32 Nybegynder
03. december 2005 - 10:50 #18
hej!
jeg får fejlmeddelse her (bliver gul):
Set wkbSales = Application.Workbooks.Open(Filename:=sSalesFile & FileNo)

er det pga const ssalesfile?
Avatar billede sjap Praktikant
03. december 2005 - 11:09 #19
Ups. Der var ikke lige luget ud: der skal stå to linier:

        sSalesFile = sSalesFileN & FileNo & ".xls"
        Set wkbSales = Application.Workbooks.Open(FileName:=sSalesFile)
Avatar billede alen32 Nybegynder
03. december 2005 - 11:10 #20
jeg har prøvet med
FileNo = Left(Format(Val(wksImport.Cells(lRowFrom, 1).Value), "0"), 2)
men får stadig fejlmeddelse aplication defined or object defined error
Avatar billede sjap Praktikant
03. december 2005 - 11:14 #21
Det kan du ikke, for FileNo defineres jo af løkken "For FileNo = 1 To 15" så den må man ikke sådan lave om på :0)
Avatar billede alen32 Nybegynder
03. december 2005 - 11:14 #22
efter jeg har indsat:
  sSalesFile = sSalesFileN & FileNo & ".xls"
        Set wkbSales = Application.Workbooks.Open(FileName:=sSalesFile)
nu får jeg fejlmeddelse her:
  Dim wkbSales As Excel.Workbook

mangler der ikke det her:
FileNo = Left(Format(Val(wksImport.Cells(lRowFrom, 1).Value), "0"), 2)
Avatar billede alen32 Nybegynder
03. december 2005 - 11:16 #23
Ok !
efter jeg har indsat:
  sSalesFile = sSalesFileN & FileNo & ".xls"
        Set wkbSales = Application.Workbooks.Open(FileName:=sSalesFile)
nu får jeg fejlmeddelse her:
  Dim wkbSales As Excel.Workbook
Avatar billede alen32 Nybegynder
03. december 2005 - 11:17 #24
fejlmeddelse: duplicate deklaration in current scope
Avatar billede sjap Praktikant
03. december 2005 - 11:18 #25
Det forstår jeg ikke. Det er jo langt før - der er jo i starten af programmet!
Avatar billede sjap Praktikant
03. december 2005 - 11:18 #26
Har du noget "gammel" kode stående? Det lyder som om wkbSales defineres to gange.
Avatar billede alen32 Nybegynder
03. december 2005 - 11:27 #27
jeg har inaktiveret Dim wkbSales As Excel.Workbook men får fejlmeddelse aplication defined or object defined error

se her:
Private Sub CommandButton1_Click()
Const sSalesFileN As String = "d:\salgsoversigt"
    Const sSalesSheetName As String = "Ark1" 'Skal ændres
    ' sCellToWriteIn - Skal ændres hver måned, så der skrives i den
    ' rigtige kolonne det er nødvendigt fordi kolonnen ikke kan findes
    'automatisk, når ikke der er tal i alle celler.
    sSalesFile = sSalesFileN & FileNo & ".xls"
    Set wkbSales = Application.Workbooks.Open(Filename:=sSalesFile)
    Const sCellToWriteIn As String = "Z1"
    Dim wkbNew As Excel.Workbook
    'Dim wkbSales As Excel.Workbook
    Dim wksImport As Excel.Worksheet
    Dim wksView As Excel.Worksheet
    Dim lRowFrom As Long
    Dim lRowTo As Long
    Dim bFound As Boolean
   
    'On Error GoTo CleanUp
    Set wkbNew = ActiveWorkbook
    Set wksImport = wkbNew.ActiveSheet

    For FileNo = 1 To 15
        Set wkbSales = Application.Workbooks.Open(Filename:=sSalesFile & FileNo)
        Set wksView = wkbSales.Worksheets(sSalesSheetName)
       
        ' 2-tallet her bestemmer hvilken række det første kundenr findes i (Update-filen)
        For lRowFrom = 2 To wksImport.UsedRange.Rows.Count
            If Left(Format(Val(wksImport.Cells(lRowFrom, 1).Value), "0"), 2) = FileNo Then
                bFound = False
               
                ' 3-tallet her bestemmer hvilken række det første kundenr findes i (Salgsview-filen)
                For lRowTo = 3 To wksView.UsedRange.Rows.Count
       
                    If Val(wksImport.Cells(lRowFrom, 1).Value) = _
                      wksView.Cells(lRowTo, 1).Value Then
       
                        wksView.Cells(lRowTo, wksView.Range(sCellToWriteIn).Column).Value = _
                            wksImport.Cells(lRowFrom, 2).Value
                        bFound = True
                        Exit For
       
                    End If
       
                Next lRowTo
       
                If Not bFound Then
                    'Cellen bliver rød, hvis ikke den er overført til opsummeringsarket
                    wksImport.Cells(lRowFrom, 1).Interior.ColorIndex = 3
                End If
            End If
        Next lRowFrom

        wkbSales.Close savechanges:=True
        Set wksView = Nothing
        Set wkbSales = Nothing
    Next FileNo


CleanUp:
    Set wksImport = Nothing
    Set wkbNew = Nothing
End Sub
Avatar billede sjap Praktikant
03. december 2005 - 11:30 #28
Det er fordi de to linier jeg skrev er sat in forkert. Prøv med denne her i stedet

Private Sub CommandButton1_Click()
    Const sSalesFileN As String = "d:\salgsoversigt"
    Const sSalesSheetName As String = "Ark1" 'Skal ændres
    ' sCellToWriteIn - Skal ændres hver måned, så der skrives i den
    ' rigtige kolonne det er nødvendigt fordi kolonnen ikke kan findes
    ' automatisk, når ikke der er tal i alle celler.
    Const sCellToWriteIn As String = "Z1"
    Dim wkbNew As Excel.Workbook
    Dim wkbSales As Excel.Workbook
    Dim wksImport As Excel.Worksheet
    Dim wksView As Excel.Worksheet
    Dim lRowFrom As Long
    Dim lRowTo As Long
    Dim bFound As Boolean

    'On Error GoTo CleanUp
    Set wkbNew = ActiveWorkbook
    Set wksImport = wkbNew.ActiveSheet

    For FileNo = 1 To 15
        sSalesFile = sSalesFileN & FileNo & ".xls"
        Set wkbSales = Application.Workbooks.Open(FileName:=sSalesFile)
        Set wksView = wkbSales.Worksheets(sSalesSheetName)
       
        ' 2-tallet her bestemmer hvilken række det første kundenr findes i (Update-filen)
        For lRowFrom = 2 To wksImport.UsedRange.Rows.Count
            If Left(Format(Val(wksImport.Cells(lRowFrom, 1).Value), "0"), 2) = FileNo Then
                bFound = False
               
                ' 3-tallet her bestemmer hvilken række det første kundenr findes i (Salgsview-filen)
                For lRowTo = 3 To wksView.UsedRange.Rows.Count
       
                    If Val(wksImport.Cells(lRowFrom, 1).Value) = _
                      wksView.Cells(lRowTo, 1).Value Then
       
                        wksView.Cells(lRowTo, wksView.Range(sCellToWriteIn).Column).Value = _
                            wksImport.Cells(lRowFrom, 2).Value
                        bFound = True
                        Exit For
       
                    End If
       
                Next lRowTo
       
                If Not bFound Then
                    'Cellen bliver rød, hvis ikke den er overført til opsummeringsarket
                    wksImport.Cells(lRowFrom, 1).Interior.ColorIndex = 3
                End If
            End If
        Next lRowFrom

        wkbSales.Close savechanges:=True
        Set wksView = Nothing
        Set wkbSales = Nothing
    Next FileNo

CleanUp:
    Set wksImport = Nothing
    Set wkbNew = Nothing
End Sub
Avatar billede alen32 Nybegynder
03. december 2005 - 12:10 #29
Filerne åbnes og lukkes-virker fint men data bliver ikke overført.
Avatar billede alen32 Nybegynder
03. december 2005 - 12:24 #30
eller gemt.
Avatar billede sjap Praktikant
03. december 2005 - 13:35 #31
Kan du sætte et "pausepunkt" i koden f.eks. i linien

bFound = False

Det er blot for at finde ud af om min if-sætning nogensinde bliver sand
Avatar billede alen32 Nybegynder
03. december 2005 - 13:56 #32
efter 'bFound = False åbnes  filen d:\salgsoversigt.xls.
Avatar billede sjap Praktikant
03. december 2005 - 13:58 #33
Hvordan kan det lige ske? Den skal slet ikke åbnes.
Avatar billede alen32 Nybegynder
03. december 2005 - 13:59 #34
det var forkert det jeg lige har skrevet efter 'bFound = False sker der ingen ændringer filerne åbnes og lukkes uden at overførsel af data.
Avatar billede sjap Praktikant
03. december 2005 - 13:59 #35
Stopper programmet i linien

bFound = False
Avatar billede sjap Praktikant
03. december 2005 - 14:00 #36
Prøv så at sætte pausepunktet i linien

If Left(Format(Val(wksImport.Cells(lRowFrom, 1).Value), "0"), 2) = FileNo Then

(det er linien lige ovenover bFound = False)
Avatar billede alen32 Nybegynder
03. december 2005 - 14:04 #37
Det virker nu! Mange tak!!
Avatar billede sjap Praktikant
03. december 2005 - 14:05 #38
Bare sådan lige pludseligt?  :0)
Avatar billede alen32 Nybegynder
03. december 2005 - 14:12 #39
Det var dejligt at det virker og igen mange tak for hjælpen, men hvis du keder kan du kigge på følgende
Der var ingen kunder som har købt noget i salgsoversigt15 og derfor blev ingen data overført og alle celler i mit regneark update farvedes røde. Er det muligt at lave sådan at nye kunder som ikke findes i salgsoversigt1 bliver farvet røde, nye kunder som ikke findes i salgsoversigt farves gule osv.
Avatar billede alen32 Nybegynder
03. december 2005 - 14:14 #40
nej ikke sådan lige pludslige. Det var mig som tilføjede en linie og den forstyrrede åbenbart.
Avatar billede sjap Praktikant
03. december 2005 - 14:30 #41
Jeg skal lige ind og rette nogle eksamensopgaver, så jeg dropper lige de røde og de gule felter indtil videre. :0)
Avatar billede sjap Praktikant
03. december 2005 - 14:39 #42
Jeg sov åbenbart også i går. Jeg troede du havde accepteret mit svar, selvom du ikke havde fået løst problemet. Jeg så ikke at du selv havde taget point også. Så var der jo ingen grund til bekymring.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester