Avatar billede bejstrup Juniormester
14. april 2009 - 13:28 Der er 15 kommentarer og
1 løsning

Fjern data

Jeg har en del data, hvor de fleste skal fjernes efter et bestemt kriterie.

ProductionWork centre    Quantity started    Good quantity
WO0000030    100    137   
WO0000030    101       
WO0000030    103       
WO0000034    100    385                    385
WO0000034    106    385                    385
WO0000034    109    385                    382
WO0000106    105       
WO0000106    105       
   
Jeg vil kune have de rækker med "Wo000030" stående tilbage, fordi:

På "Wo000034" er alle operationer påbegyndt og fuldendt, så de er ikke interssante. Det ses ved at der står tal både i kolonnen "Quantity startet" og "good Quantity"

På "Wo000000106" er der ikke startet nogle operationer, så den er jeg heller ikke interesseret i. Det ses ved at der hverken står tal i kolonnen "Quantity startet" eller "good Quantity"


"Wo000030" er en igangværende ordre, så den vil jeg have stående tilbage. Det ses ved at der står et tal i kolonnen "Quantity startet" men ikke i "good Quantity"

Det skal således være alle rækker med "Wo000030", selv om det kun er den ene række der opfylder kriteriet. Det er fordi jeg skal bruge alle operationer på ordren.


Det skal bemærkes at jeg har et par tusinde rækker, så det er et stor arbejde at gøre manuelt.

Jeg håber i kan hjælpe
Avatar billede CCodam Nybegynder
14. april 2009 - 13:52 #1
Hmm, der er sikkert en bedre/nemmere måde at gøre dette på, men dette burde i hvert fald gøre det :)

Gem dit excel dokument som excel.csv (Comma Delimited), og lig den i C:\

Åben notepad, og kopier følgende ind, og gem det som script.vbs


Dim FSO, readfile, writefile
Dim arrText

Set FSO = CreateObject("Scripting.FileSystemObject")
Set readfile = FSO.OpenTextFile("c:\excel.csv", 1, false)
Set writefile = FSO.CreateTextFile("c:\nyexcel.csv", true)

writefile.WriteLine(readfile.ReadLine)

Do While Not readfile.AtEndOfStream
  If InStr(readfile.Readline, "WO0000030") > 0 Then
  writefile.WriteLine(readfile.ReadLine)
  End If
Loop

readfile.close
writefile.close


Åben C:\nyexcel.csv i Excel, og gem den som et normalt Excel dokument, du burde nu kun havde de udvalgte linier :)

Som sagt, muligvis ikke den nemmeste/flotteste metode, men burde virke, og hvis ikke, så må du endelig lige skrive...
Avatar billede CCodam Nybegynder
14. april 2009 - 13:54 #2
Ihh mangler en rediger knap her på eksperten :P

scriptet skal se sådan her ud:

Dim FSO, readfile, writefile
Dim text

Set FSO = CreateObject("Scripting.FileSystemObject")
Set readfile = FSO.OpenTextFile("c:\excel.csv", 1, false)
Set writefile = FSO.CreateTextFile("c:\nyexcel.csv", true)

writefile.WriteLine(readfile.ReadLine)

Do While Not readfile.AtEndOfStream
  text = readfile.ReadLine
  If InStr(text, "WO0000030") > 0 Then
  writefile.WriteLine(text)
  End If
Loop

readfile.close
writefile.close
Avatar billede bejstrup Juniormester
14. april 2009 - 14:35 #3
Hej,
Jeg ville helst have det til at køre som en makro :-)
Der bliver ikke dannet en "nyexcel.csv" :-(
Avatar billede CCodam Nybegynder
14. april 2009 - 14:58 #4
#3 Ja ok, er jo også det smarteste, hvis det er noget du skal have gjort ofte...men så må vi vente til nogen med lidt bedre Excel VBA/Makro kunnen kommer forbi...

Scriptet virker fint her, men min plan om C:\ var lidt dum, da vista formegentlig ikke er meget for det...

Du kan evt ændre lokationerne til et andet sted, og prøve igen :)
Set readfile = FSO.OpenTextFile("c:\mappe\excel.csv", 1, false)
Set writefile = FSO.CreateTextFile("c:\mappe\nyexcel.csv", true)
Avatar billede bejstrup Juniormester
15. april 2009 - 09:19 #5
Jeg tror ikke jeg har formuleret mit spørgsmål godt nok.
Jeg søger noget i retning af:
hvis rækken har et tal i kolonne C, kontroller om der står et tal i kolonne D i samme række. Hvis der ikke står et tal i kolonne D i samme række, skal alle rækker med samme Wo-nummer blive stående, uanset om der står tal i kolonne C og/eller kolonne D. Alt andet skal slettes.
Avatar billede CCodam Nybegynder
15. april 2009 - 09:50 #6
#5 Som sagt, har jeg ikke kompetence til at lave det du beskriver i Excel :/
Jeg kan dog sagtens lave et script, som dem tidligere postet i denne tråd, der opfylder dine krav beskrevet i #5

Men det ved jeg ikke, om du overhovedet er interesseret i?
Avatar billede bejstrup Juniormester
15. april 2009 - 10:02 #7
Hvis du kan det, vil det være kanon godt :-)
Avatar billede excelent Ekspert
15. april 2009 - 10:17 #8
Har du prøvet med Autofilter ?
Avatar billede CCodam Nybegynder
15. april 2009 - 10:30 #9
#7 Prøv med følgende...igen gem som filnavn.script, og sørg for at din excel.csv ligger i c:\mappe eller, ændre evt dette i scriptet :)


Dim FSO, readfile, writefile
Dim text, arrText, group

Set FSO = CreateObject("Scripting.FileSystemObject")
Set readfile = FSO.OpenTextFile("c:\mappe\excel.csv", 1, false)
Set writefile = FSO.CreateTextFile("c:\mappe\nyexcel.csv", true)

writefile.WriteLine(readfile.ReadLine) ' Første linie (overskrifter) skal ikke tjekkes

Do While Not readfile.AtEndOfStream
  text = readfile.ReadLine
  arrText = Split(text, ",") ' Det er muligt at Dansk Excel bruger ; i stedet for ,
  If arrText(0) = group Then
    writefile.WriteLine(text)
  ElseIf Len(arrText(2)) > 0 AND Len(arrText(3)) = 0 Then
    group = arrText(0)
    writefile.WriteLine(text)
  End If
Loop

readfile.close
writefile.close


Læg mærke til at "," muligvis skal være ";" i dit tilfælde (arrText = Split(text, ","))
Jeg ved ikke om det danske Excel benytter sig af ; i stedet for , når den laver en .csv fil :)
Avatar billede bejstrup Juniormester
15. april 2009 - 11:20 #10
Jeg har forsøgt både med "," og ";", men jeg får ikke danne en nyexcel.csv, af en eller anden grund :-(
Avatar billede CCodam Nybegynder
15. april 2009 - 12:18 #11
#10 Hmm, det er godt nok mærkeligt, især hvis den ikke engang kommer med en fejl herom...

Du kan tjekke om det skal være "," eller ";", hvis du højreklikker på din .csv fil og åbner den med notepad

Hvis det kun er noget du skal gøre en enkelt gang, så kan jeg godt gøre det for dig, hvis du uploader filen et sted?

Ellers må du forsøge dig på en anden computer :/ det virker perfekt her...
Avatar billede CCodam Nybegynder
15. april 2009 - 12:21 #12
Hov jeg så lige at jeg i #9 er kommet til at skrive, at du skulle gemme scriptet som filnavn.script, det skal selvfølgelig gemmes som filnavn.vbs

Du kan evt. sætte følgende linie ind aller nederst i scriptet:
MsgBox("Done")
Dette vil sørge for at du får en popup box med "Done", så du ved at scriptet er kørt igennem...
Avatar billede CCodam Nybegynder
15. april 2009 - 23:53 #13
#10 Fik du det til at virke? eller skal jeg lige hurtigt køre scriptet igennem din fil for dig?
Avatar billede bejstrup Juniormester
16. april 2009 - 10:56 #14
Det ser desværreikke ud til at scriptet kører. Det er vigtigt for mig at finde en løsning, så jeg ikke skal bruge så lang tid på at gøre det manuelt hver dag.
Avatar billede CCodam Nybegynder
16. april 2009 - 12:00 #15
#14 Kan du evt tilføje mig på MSN: cco AT coretech DOT dk

Så jeg kan se et udsnit af din csv fil, og se om vi kan finde en løsning...
Avatar billede CCodam Nybegynder
20. april 2009 - 10:38 #16
Vi endte ud med følgende script, der klarede jobbet :)

Dim FSO, readfile, writefile
Dim text, arrText, arrTextWrite()
Dim group, count, countTrue

Set FSO = CreateObject("Scripting.FileSystemObject")
Set readfile = FSO.OpenTextFile("c:\mappe\excel.csv", 1, false)
Set writefile = FSO.CreateTextFile("c:\mappe\nyexcel.csv", true)


writefile.WriteLine(readfile.ReadLine) ' Første linie (overskrifter) skal ikke tjekkes

text = readfile.ReadLine
arrText = Split(text, ";") ' Dansk Excel = ";" Engelsk Excel = ","

Do While Not readfile.AtEndOfStream
  count = 0
  countTrue = 0
  Erase arrTextWrite
  doWrite = False
  group = arrText(1)
 
 
  Do While group = arrText(1)
   
    ReDim Preserve arrTextWrite(count)
    arrTextWrite(count) = text

    If Len(arrText(6)) > 0 AND Len(arrText(7)) > 0 Then
      countTrue = countTrue + 1
    End If
   
    text = readfile.ReadLine
    arrText = Split(text, ";") ' Dansk Excel = ";" Engelsk Excel = ","
    count = count + 1
  Loop
 

  If countTrue > 0 AND countTrue < count Then
    For Each x in arrTextWrite
      writefile.WriteLine(x)
    Next
  End If
Loop

readfile.close
writefile.close
MsgBox("Done")
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

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