Private Sub worksheet_change(ByVal Target As Excel.Range) Dim vareNavn As String Dim vareNavn2 As String
If Not Intersect(Target, Range(vareNrindtastesI)) Is Nothing Then If Len(Target) > 0 Then vareNavn = søgVare(Target.Value) If vareNavn <> "" Then Cells(Target.Row, Target.Column + 1) = vareNavn Else MsgBox ("Varenr. " + CStr(Target.Value) + " kunne ikke findes!") Cells(Target.Row, Target.Column) = "" Cells(Target.Row, Target.Column + 1) = "" End If Else Cells(Target.Row, Target.Column) = "" Cells(Target.Row, Target.Column + 1) = "" End If
If Len(Target) > 0 Then vareNavn2 = søgVare2(Target.Value) If vareNavn2 <> "" Then Cells(Target.Row, Target.Column + 5) = vareNavn2 Else Cells(Target.Row, Target.Column + 5) = "" End If Else Cells(Target.Row, Target.Column + 5) = "" End If End If
End Sub
Private Function søgVare(knr) Set kXLS = CreateObject("Excel.application") With kXLS .Workbooks.Open kildeSti
Den moderne arbejdsplads er i stigende grad afhængig af mødelokaler til at fremme samarbejde, men dette skift medfører også stigende sikkerhedsudfordringer.
Private Function søgVare(knr) Set kXLS = CreateObject("Excel.application") Dim Sh As Worksheet 'NY With kXLS .Workbooks.Open kildeSti For Each Sh In ActiveWorkbook.Worksheets 'NY Sh.Activate ' NY Range("A1").Select ' NY kildeRækker = ActiveCell.SpecialCells(xlLastCell).Row
For r = 11 To kildeRækker If knr = .Cells(r, 1) Then søgVare = .Cells(r, 2) lukObject Exit Function End If
Next r End With Next ' NY lukObject søgVare = "" End Function
Private Function søgVare(knr) Set kXLS = CreateObject("Excel.application") Dim Sh As Worksheet 'NY With kXLS .Workbooks.Open kildeSti For Each Sh In ActiveWorkbook.Worksheets 'NY Sh.Activate ' NY Range("A1").Select ' NY kildeRækker = ActiveCell.SpecialCells(xlLastCell).Row
For r = 11 To kildeRækker If knr = .Cells(r, 1) Then søgVare = .Cells(r, 2) lukObject Exit Function End If
Next r Next ' NY End With lukObject søgVare = "" End Function
Vi prøver at aktivere en anden celle, jeg kan se at du starter i række 11
Private Function søgVare(knr) Set kXLS = CreateObject("Excel.application") Dim Sh As Worksheet 'NY With kXLS .Workbooks.Open kildeSti For Each Sh In ActiveWorkbook.Worksheets 'NY Sh.Activate ' NY Range("A11").Select ' NY kildeRækker = ActiveCell.SpecialCells(xlLastCell).Row
For r = 11 To kildeRækker If knr = .Cells(r, 1) Then søgVare = .Cells(r, 2) lukObject Exit Function End If
Next r Next ' NY End With lukObject søgVare = "" End Function
Private Function søgVare(knr) Dim Sh As Worksheet 'NY Workbooks.Open kildeSti For Each Sh In ActiveWorkbook.Worksheets 'NY Sh.Activate ' NY Range("A11").Select ' NY kildeRækker = ActiveCell.SpecialCells(xlLastCell).Row
For r = 11 To kildeRækker If knr = Cells(r, 1) Then søgVare = Cells(r, 2) lukObject Exit Function End If
Next r Next ' NY lukObject søgVare = "" End Function
Private Sub lukObject() Workbooks("Data.xls").Close 'Application.Quit End Sub
Private Function søgVare(knr) Set kXLS = CreateObject("Excel.application") Dim Sh As Worksheet 'NY With kXLS .Workbooks.Open kildeSti For Each Sh In .Worksheets 'NY With Sh .Activate ' NY kildeRækker = .Range("A65536").End(xlUp).Row
For r = 1 To kildeRækker If knr = .Cells(r, 1) Then søgVare = .Cells(r, 2) lukObject Exit Function End If
Next r End With Next ' NY End With lukObject søgVare = "" End Function
Private Sub lukObject() With kXLS .ActiveWorkbook.Close .Application.Quit End With Set kXLS = Nothing End Sub
Min fejl. Jeg havde ikke opdaget at der var en fejl i kildefilen vedr. redundans. Når denne er fjernet virker det perfekt.
Tusind tak for hjælpen. Point til dig.
Lige et bonus spørgsmål. Koden er sådan at når jeg sletter indformationen i destinationsarkets celle A16:A56 så sletter den også værdien i cellerne til højre for som jeg har hentet. Det virker sådan set også fint nok. Men:
1. Hvorfor tænker den så lang tid efter jeg har slette værdien i A (timeglas i 5-10 sekunder)
2. Hvis jeg markerer flere celler på en gang i kolonne A for at slette informationen så fejler den på denne linie...If Len(Target) > 0 Then
Private Sub worksheet_change(ByVal Target As Excel.Range) Dim vareNavn As String Dim vareNavn2 As String If Not Intersect(Target, Range(vareNrindtastesI)) Is Nothing Then
If Target.Cells.Count > 1 Then Exit Sub ' NY tjekker om du har flere celler markeret, hvis ja køres koden ikke
If Len(Target) > 0 Then vareNavn = søgVare(Target.Value) If vareNavn <> "" Then Cells(Target.Row, Target.Column + 1) = vareNavn Else MsgBox ("Varenr. " + CStr(Target.Value) + " kunne ikke findes!") Cells(Target.Row, Target.Column) = "" Cells(Target.Row, Target.Column + 1) = "" End If Else Cells(Target.Row, Target.Column) = "" Cells(Target.Row, Target.Column + 1) = "" End If
If Len(Target) > 0 Then vareNavn2 = søgVare2(Target.Value) If vareNavn2 <> "" Then Cells(Target.Row, Target.Column + 5) = vareNavn2 Else Cells(Target.Row, Target.Column + 5) = "" End If Else Cells(Target.Row, Target.Column + 5) = "" End If End If End Sub
Den kikker på alle rækker der er data i i kolonne A, den finder selv den sidste. Hvorfor skal den køre, for flere celler i Target(markeringen), du skriver vel ikke flere forskellige søgekriterier på en gang.
Jeg skriver kun en af gangen og så skifter jeg til næste celle osv. når den skal søge.
Men hvis jeg vil slette alle de linier jeg har lavet (f.eks. har jeg måske skrevet noget på 10 linier) så markerer jeg fra A16 til A25 og trykker delete.
Så den skal slette hele området når jeg markerer enten kun kolonne A16 til A25 eller A16 til F25 (altså hele dataområdet)
Private Sub worksheet_change(ByVal Target As Excel.Range) Dim vareNavn As String Dim vareNavn2 As String Dim C As Range If Not Intersect(Target, Range(vareNrindtastesI)) Is Nothing Then Application.EnableEvents = False Application.ScreenUpdating = False For Each C In Target.Cells If Len(C) > 0 Then vareNavn = søgVare(C.Value) If vareNavn <> "" Then Cells(C.Row, C.Column + 1) = vareNavn Else MsgBox ("Varenr. " + CStr(C.Value) + " kunne ikke findes!") Range(Cells(C.Row, C.Column), Cells(C.Row, C.Column + 5)) = "" End If Else Range(Cells(C.Row, C.Column), Cells(C.Row, C.Column + 5)) = "" End If
If Len(C) > 0 Then vareNavn2 = søgVare2(C.Value) If vareNavn2 <> "" Then Cells(C.Row, C.Column + 5) = vareNavn2 Else Cells(C.Row, C.Column + 5) = "" End If Else Cells(C.Row, C.Column + 5) = "" End If Next End If Application.ScreenUpdating = True Application.EnableEvents = True End Sub
P.S. Hvor lang tid tager det hos dig at hente data fra kildefilen til destinationsfilen. Det tager nemlig ca. 10 sekunder her. Kildefilen er nemlig ikke så stor, ca. 10 ark med max. 150 linier pr. ark ?
jeg kan måske gøre det hurtigere, hvis du også viser mig din "søgVare2" funktion, hvis den søger i samme som "søgVare", kan man tage i et hug, måske kan vi tage data fra kildefilen, over i et array, det vil gøre den meget hurtigere.
Kildefilen vil blive opdateret løbende og udvidet med nye ark og linier. Men altid med samme kolonne overskrifter m.v. Kildefilen er en jeg modtager fra en anden person.
Her er min SøgVare2-funktion. Jeg skal i princippet bruge et par funktioner mere der henter data fra kildefilen over i destinationsfilen. Og dette var den eneste måde jeg kunne finde ud af at lave det på.
Private Function søgVare2(knr) Set kXLS = CreateObject("Excel.application") Dim Sh As Worksheet 'NY With kXLS .Workbooks.Open kildeSti For Each Sh In .Worksheets 'NY With Sh .Activate ' NY kildeRækker = .Range("A65536").End(xlUp).Row
For r = 1 To kildeRækker If knr = .Cells(r, 1) Then søgVare2 = .Cells(r, 4) lukObject Exit Function End If
Next r End With Next ' NY End With lukObject søgVare2 = "" End Function
Dim Data() As Variant Const kildeSti = "H:\Data.xls" Dim kXLS, kildeRækker, Rækker As Integer Dim RW As Long Const vareNrindtastesI = "A16:A51"
Private Sub worksheet_change(ByVal Target As Excel.Range) Dim vareNavn As String Dim vareNavn2 As String Dim C As Range, I As Long Dim Fundet As Boolean If Not Intersect(Target, Range(vareNrindtastesI)) Is Nothing Then If RW = 0 Then HentData ' tjekker om data er indlæst, hvis ikke hentes de Application.EnableEvents = False Application.ScreenUpdating = False For Each C In Target.Cells Fundet = False If Len(C) > 0 Then For I = 1 To RW If Data(I, 0) = C.Value Then Cells(C.Row, C.Column + 1) = Data(I, 1) Cells(C.Row, C.Column + 5) = Data(RW, 4) Fundet = True Exit For End If Next If Not Fundet Then MsgBox ("Varenr. " + CStr(C.Value) + " kunne ikke findes!") Range(Cells(C.Row, C.Column), Cells(C.Row, C.Column + 5)) = "" End If Else Range(Cells(C.Row, C.Column), Cells(C.Row, C.Column + 5)) = "" End If Next End If Application.EnableEvents = True Application.ScreenUpdating = True End Sub
Private Sub lukObject() With kXLS .ActiveWorkbook.Close .Application.Quit End With Set kXLS = Nothing End Sub Private Function HentData() Set kXLS = CreateObject("Excel.application") Dim Sh As Worksheet With kXLS .Workbooks.Open kildeSti For Each Sh In .Worksheets 'NY With Sh .Activate kildeRækker = kildeRækker + .Range("A65536").End(xlUp).Row ' tæller hvor mange data rækker, der er ialt End With Next ReDim Data(kildeRækker, 5) ' klargør arrayet til at indeholde data, med 6 kolonner i RW = 0 ' første kolonne hedder 0 For Each Sh In .Worksheets 'NY Rækker = .Range("A65536").End(xlUp).Row With Sh For r = 1 To Rækker RW = RW + 1 For I = 1 To 5 Data(RW, I - 1) = .Cells(r, I) ' lægger data ind i array Next Next End With Next End With lukObject End Function
Public Sub StartAutomatiskeMakroer() ' kør denne makro, hvis de automatiske svigter ' det kan de gøre hvis koden går i stå imellem disse 2 linier ' Application.EnableEvents = False ' og ' Application.EnableEvents = True
Application.EnableEvents = True End Sub
det var vist det du behøver, prøv at teste.
første gang du søger går det lidt tid, da den henter data først, men derefter skulle det gå hurtigt.
Dim Data() As Variant Const kildeSti = "H:\Data.xls" Dim kXLS, kildeRækker, Rækker As Integer Dim RW As Long Const vareNrindtastesI = "A16:A51"
Private Sub worksheet_change(ByVal Target As Excel.Range) Dim vareNavn As String Dim vareNavn2 As String Dim C As Range, I As Long Dim Fundet As Boolean If Not Intersect(Target, Range(vareNrindtastesI)) Is Nothing Then If RW = 0 Then HentData ' tjekker om data er indlæst, hvis ikke hentes de Application.EnableEvents = False Application.ScreenUpdating = False For Each C In Target.Cells Fundet = False If Len(C) > 0 Then For I = 1 To RW If Data(I, 0) = C.Value Then Cells(C.Row, C.Column + 1) = Data(I, 1) Cells(C.Row, C.Column + 5) = Data(RW, 4) Fundet = True Exit For End If Next If Not Fundet Then MsgBox ("Varenr. " + CStr(C.Value) + " kunne ikke findes!") Range(Cells(C.Row, C.Column), Cells(C.Row, C.Column + 5)) = "" End If Else Range(Cells(C.Row, C.Column), Cells(C.Row, C.Column + 5)) = "" End If Next End If Application.EnableEvents = True Application.ScreenUpdating = True End Sub
Private Sub lukObject() With kXLS .ActiveWorkbook.Close .Application.Quit End With Set kXLS = Nothing End Sub Private Function HentData() Set kXLS = CreateObject("Excel.application") Dim Sh As Worksheet With kXLS .Workbooks.Open kildeSti For Each Sh In .Worksheets 'NY With Sh .Activate kildeRækker = kildeRækker + .Range("A65536").End(xlUp).Row ' tæller hvor mange data rækker, der er ialt End With Next ReDim Data(kildeRækker, 5) ' klargør arrayet til at indeholde data, med 6 kolonner i RW = 0 ' første kolonne hedder 0 For Each Sh In .Worksheets 'NY Rækker = .Range("A65536").End(xlUp).Row With Sh For r = 1 To Rækker RW = RW + 1 For I = 1 To 5 Data(RW, I - 1) = .Cells(r, I) ' lægger data ind i array Next Next End With Next End With lukObject End Function
Public Sub StartAutomatiskeMakroer() ' kør denne makro, hvis de automatiske svigter ' det kan de gøre hvis koden går i stå imellem disse 2 linier ' Application.EnableEvents = False ' og ' Application.EnableEvents = True
Private Function HentData() Set kXLS = CreateObject("Excel.application") Dim Sh As Worksheet With kXLS .Workbooks.Open kildeSti For Each Sh In .Worksheets 'NY With Sh .Activate kildeRækker = kildeRækker + .Range("A65536").End(xlUp).Row ' tæller hvor mange data rækker, der er ialt End With Next ReDim Data(kildeRækker, 5) ' klargør arrayet til at indeholde data, med 6 kolonner i RW = 0 ' første kolonne hedder 0 For Each Sh In .Worksheets With Sh Rækker = .Range("A65536").End(xlUp).Row
For r = 1 To Rækker RW = RW + 1 For I = 1 To 5 Data(RW, I - 1) = .Cells(r, I) ' lægger data ind i array Next Next End With Next End With lukObject End Function
Jeg fik din mail, men jeg kunne ikke svare, jeg fik "Delivery to the following recipients failed."
jeg har nu tunet denne del lidt op, prøv at teste.
Private Function HentData() Set kXLS = CreateObject("Excel.application") Dim Sh As Worksheet Dim Temp As Variant With kXLS .Workbooks.Open kildeSti For Each Sh In .Worksheets 'NY With Sh .Activate kildeRækker = kildeRækker + .Range("A65536").End(xlUp).Row ' tæller hvor mange data rækker, der er ialt End With Next ReDim Data(kildeRækker, 5) ' klargør arrayet til at indeholde data, med 6 kolonner i RW = 0 ' første kolonne hedder 0 For Each Sh In .Worksheets With Sh Rækker = .Range("A65536").End(xlUp).Row Temp = .Range("A1:E" & Rækker) For R = 1 To Rækker If IsNumeric(Temp(R, 1)) Then RW = RW + 1 For I = 1 To 5 Data(RW, I - 1) = Temp(R, I) ' lægger data ind i array Next End If Next End With Next End With lukObject End Function
Mener du skifte imellem arkene i den mappe, som koden står i, koden har ikke noget at gøre med, at du skifter ark, det må være noget andet. Koden skal jo kun køres 1 gang, når du åbner mappen.
Har du nogen automatiske makroer, der kører, når du skifter side
som f.eks. Private Sub worksheet_change(ByVal Target As Excel.Range)
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.