15. september 2015 - 21:17Der er
32 kommentarer og 1 løsning
Vba til flytning eller sletning af værdi i celle
Hej derude, Jeg har en workbook bestående af 10 sheets. I denne workbook har jeg en vba som sikrer imod dubletter. Dette gør den ved, at jeg i hvilken som helst celle og i hvilket som helst sheet, får en msgbox som siger "varenr eksisterer allerede i (her står så det aktuelle ark), indtast nyt varenr". Jeg kan så annullere og cellen forbliver tom eller jeg kan indtaste et ander varenr, hvorefter nummeret bliver skrevet i denne celle. Ville høre om det er muligt, at i tilfælde af at varenummeret allerede eksisterer, så kan blive slettet i denne celle som det er i. Eksempel: I ark 1 celle d4 indtaster jeg følgende varenr: 123456. Dette varenr er allerede i ark 2 celle h8, men jeg vil gerne have en msgbox som siger: Varenr eksisterer allerede i ark 2, vil du oprette alligevel? Hvis jeg så trykker ok i msgbox, så bliver varenr oprettet i ark 1 celle d4 og samtidig slettet i ark 2 celle h8? Jeg skal så også kunne vælge at taste et andet varenr eller annullere Håber at min forklaring er til at tyde :-)
Ps. Skal i øvrigt have fundet et godt sted, at få et par vba kurser. Hvis i har et godt sted, så er jeg meget lydhør, da jeg stadig er rimelig grøn.
Sagen er, at jeg bruger det til indkøb og hver ark er måned. Når jeg får en ordre med varenr hjem, så skal den tidligere ordre og dermed varenr slettes, så feltet står tomt. Jeg har alle mine ordrer leveret dag til dag, så får først ordren/varenr hjem når det gamle er opbrugt. Så det er for overskuelighedens skyld og det faktum, at jeg bare kan køre videre med denne workbook i uendelighed.
Og samtidig så bruger jeg dele af samme type ark som lagerstyring af færdig producerede varer. Varer som ændrer lokationer både internt og eksternt. Her vil jeg også kunne bruge denne vba som en mulighed.
Min range er fra A:AN i samtlige sheets. Der er rigtig mange numre, da der er varenr på alle små ordre/dimser. Så jeg har vel små 2000 varenumre fordelt over de 12 sheets. Sheet 1 kan eksempelvis indeholde varenumre i A:1, A:4, A:4, B:3, C:7, F:7 osv osv. Det samme i de andre sheets.
Har skrevet den basale VBA-kode - men er ikke færdig med detaljen. Men det er ikke et problem at opfylde det ønskede.. Fortsætter i morgen.
PS: Lidt VBA-kursus/undervisning/Mentoring kan evt. også klares.
Dim antalArk As Integer Dim vareNr As Long, arkNr As Integer Dim antalRækker As Integer, antalKolonner As Integer Dim arkNavn As String, dubLetAdresse As String Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) ' Stop vareNr = Target arkNavn = ActiveSheet.Name
For arkNr = 1 To ActiveWorkbook.Sheets.Count If arkNavn <> Sheets(arkNr).Name Then Sheets(arkNr).Activate antalRækker = ActiveCell.SpecialCells(xlLastCell).Row antalKolonner = ActiveCell.SpecialCells(xlLastCell).Column
dubLetAdresse = findesDublet If dubLetAdresse <> "" Then MsgBox dubLetAdresse End If End If Next arkNr End Sub Private Function findesDublet() With Sheets(arkNr).Range(Cells(1, 1), Cells(antalRækker, antalKolonner)) Set c = .Find(vareNr, LookIn:=xlValues, LookAt:=xlWhole) If Not c Is Nothing Then findesDublet = c.Address Else findesDublet = "" End If End With End Function
Det lyder super, begge dele. Har også lige hurtigt tjekket dit link til http://supertekst-it.dk/. Glæder mig til, at se videre på koden i morgen. Tak indtil videre..
ren Version 2 Dim antalArk As Integer Dim vareNr As Long, arkNr As Integer Dim antalRækker As Integer, antalKolonner As Integer Dim arkNavn As String, dubLetAdresse As String, flag As Boolean Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim svar As Integer 'Stop Application.ScreenUpdating = False
If flag = False Then vareNr = Target arkNavn = ActiveSheet.Name End If
For arkNr = 1 To ActiveWorkbook.Sheets.Count If arkNavn <> Sheets(arkNr).Name And flag = False And Target <> "" Then Sheets(arkNr).Activate antalRækker = ActiveCell.SpecialCells(xlLastCell).Row antalKolonner = ActiveCell.SpecialCells(xlLastCell).Column
dubLetAdresse = findesDublet If dubLetAdresse <> "" Then svar = MsgBox("Varenr. eksistere allerede i ark " & arkNr & ", vil du oprette alligevel?", vbOKCancel, "Dublet-test") If svar = 1 Then flag = True ActiveSheet.Range(dubLetAdresse) = "" flag = False Exit For Else Target = "" End If End If End If Next arkNr
Sheets(arkNavn).Activate End Sub Private Function findesDublet() With Sheets(arkNr).Range(Cells(1, 1), Cells(antalRækker, antalKolonner)) Set c = .Find(vareNr, LookIn:=xlValues, LookAt:=xlWhole) If Not c Is Nothing Then findesDublet = c.Address Else findesDublet = "" End If End With End Function
Hmm, det virker næsten. Eneste problem er, at den ikke reagerer på, hvis jeg opretter varenummeret i samme ark som der er et allerede. Jeg får jo nogle gange 2 leveringer I samme måned/sheet. Jeg har et enkelt felt I ark nr 1 som søgefelt på varenr. Jeg har forgæves forsøgt, at få den til at exit sub med denne:
If ActiveSheet.Name = "Ark1" And Target.Address = "$AI$1" Then Exit Sub
Har bevidst undtaget den aktuelle side i koden da jeg ikke forestillede mig dette som relevant, men kan der laves om på Altså version 3 vil blive udviklet
Rem I en pause kunne jeg så lige.. - inden hovedet røg helt af :-) rem #21 kan det vente lidt - men prøv at nedskriv dine tanker om hvad og hvordan - så er du velkommen til at sende via mail - @-adresse under min profil.
Rem Version 3 Dim antalArk As Integer Dim vareNr As Long, arkNr As Integer Dim antalRækker As Integer, antalKolonner As Integer Dim arkNavn As String, dubLetAdresse As String, flag As Boolean, adr As String Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim svar As Integer 'Stop Application.ScreenUpdating = False
If flag = False Then vareNr = Target adr = Target.Address arkNavn = ActiveSheet.Name End If
For arkNr = 1 To ActiveWorkbook.Sheets.Count If flag = False And Target <> "" Then Sheets(arkNr).Activate antalRækker = ActiveCell.SpecialCells(xlLastCell).Row antalKolonner = ActiveCell.SpecialCells(xlLastCell).Column
dubLetAdresse = findesDublet If ActiveSheet.Name = "Ark1" And Target.Address = "$AI$1" Then Exit For Else If dubLetAdresse <> "" And dubLetAdresse <> adr Then svar = MsgBox("Varenr. eksistere allerede i ark " & arkNr & ", vil du oprette alligevel?", vbOKCancel, "Dublet-test") If svar = 1 Then flag = True ActiveSheet.Range(dubLetAdresse) = "" flag = False Exit For Else Target = "" End If End If End If End If Next arkNr
Sheets(arkNavn).Activate End Sub Private Function findesDublet() With Sheets(arkNr).Range(Cells(1, 1), Cells(antalRækker, antalKolonner)) Set c = .Find(vareNr, LookIn:=xlValues, LookAt:=xlWhole) If Not c Is Nothing Then findesDublet = c.Address Else findesDublet = "" End If End With End Function
Super, du hører fra mig på mail, men der går nok lige 1-2 uger. Ps. Kan den ændres til, at skrive ark navn i stedet for nr, altså der hvor dubletten er i forvejen? Tænker Januar, Februar osv i stedet for ark 1, ark 2 osv. Bare en lille detalje, men hvis det er for besværligt at ændre, så går det andet også an.
Hvis den kan generere navnet, så det passer i forhold til fanens navn, så vil det være perfekt. Altså så det ændres automatisk, hvis jeg ændrer navnet på fanerne senere.
Ok, men hvis det er nemmere at skrive navnene på arkene som Januar, Februar osv i vba, så kan jeg også selv rette navnene i koden, hvis jeg ændrer på fane navnene. Er ikke så meget inde i vba, at jeg ved hvordan det skal gøres, der er du eksperten :-) Jeg sætter virkelig stor pris på din hjælp og håber at jeg får tvunget et kursus/mentoring igennem hos min arbejdsgiver. Men de plejer, at være til at snakke med og vi har haft drøftet det tidligere, hvor jeg er blevet bedt om, at undersøge mulighederne. Og når de kan se, hvad du har hjulpet med mig her, så er det også lidt nemmere :-)
Rem Version 4 Dim antalArk As Integer Dim vareNr As Long, arkNr As Integer Dim antalRækker As Integer, antalKolonner As Integer Dim arkNavn As String, dubLetAdresse As String, flag As Boolean, adr As String Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim svar As Integer 'Stop Application.ScreenUpdating = False
If flag = False Then vareNr = Target adr = Target.Address arkNavn = ActiveSheet.Name End If
For arkNr = 1 To ActiveWorkbook.Sheets.Count If flag = False And Target <> "" Then Sheets(arkNr).Activate antalRækker = ActiveCell.SpecialCells(xlLastCell).Row antalKolonner = ActiveCell.SpecialCells(xlLastCell).Column
dubLetAdresse = findesDublet If ActiveSheet.Name = "Ark1" And Target.Address = "$AI$1" Then Exit For Else If dubLetAdresse <> "" And dubLetAdresse <> adr Then svar = MsgBox("Varenr. eksistere allerede i " & Sheets(arkNr).Name & ", vil du oprette alligevel?", vbOKCancel, "Dublet-test") If svar = 1 Then flag = True ActiveSheet.Range(dubLetAdresse) = "" flag = False Exit For Else Target = "" End If End If End If End If Next arkNr
Sheets(arkNavn).Activate End Sub Private Function findesDublet() With Sheets(arkNr).Range(Cells(1, 1), Cells(antalRækker, antalKolonner)) Set c = .Find(vareNr, LookIn:=xlValues, LookAt:=xlWhole) If Not c Is Nothing Then findesDublet = c.Address Else findesDublet = "" End If End With End Function
Hej igen, Vender som aftalt tilbage til dig. Vi har været igennem en stor ændring på jobbet, så der går lige lidt længere tid nu. Men jeg arbejder skam stadig på sagen og ville høre om du stadig laver lidt support/kurser i vba?
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.