SUMIF()quote:Op dinsdag 26 april 2016 22:21 schreef Cikx het volgende:
Ik heb een vraagje:
Ik heb 2 kolommen met data (zeg A en B) die niet op alle plekken gevuld zijn. Nu heb ik een IF functie toegepast die me een 1 geeft wanneer A1 en B1 tegelijkertijd een willekeurige waarde in hun cel hebben staan en de functie geeft me een 0 wanneer er in beide of in 1 van beide cellen geen waarde staat, dus: =IF (AND(A1>0;B1>0);1;0).
Deze functie heb ik naar beneden gesleept (zeg in kolom D) en beslaat nu zo'n 2000 rijen met 1-en en 0-len overeenkomstig met de data. Op het einde tel ik alle 1-en op, dus ik neem de som van de hele kolom om zo te zien hoe vaak er een waarde in kolom A en tegelijkertijd in kolom B staat en dat werkt eigenlijk prima. Maar nu vroeg ik me af of het mogelijk is om dit alles in 1 formule te zetten. Zodat ik geen 2000 rijen hoef te beslaan om vervolgens alle cellen op te tellen.
Ik hoop dat de vraag een beetje duidelijk is, als het nodig is kan ik misschien wat meer informatie geven, misschien met screenshots.
Alvast Bedankt!
Als je een beetje ervaring hebt met vba, dan je hele csv export doen via macro. En dan met stream read/write voorbeeld de text inlezen en dan iets van StrStream = left(StrStream, len(StrStream )-2)quote:Op dinsdag 26 april 2016 13:34 schreef Modus het volgende:
Ik denk dat het ergens best werkbaar zal zijn voor de gebruiker om deze eenmalige handeling nog in Notepad te doen, omdat we met deze csv sowieso al heel veel tijd gaan winnen, maar ik heb ergens het idee dat ook dit probleem gewoon opgelost zou moeten kunnen worden.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | Sub test() Dim filenaam As String Dim StrStream As String filenaam = "D:\Folder\book1.csv" Set objFSO = CreateObject("Scripting.FileSystemObject") Set objfile = objFSO.OpenTextFile(filenaam, 1) Do Until objfile.AtEndOfStream StrStream = StrStream & objfile.ReadLine & vbCrLf Loop Debug.Print StrStream objfile.Close Set objFSO = CreateObject("Scripting.FileSystemObject") 'Opnieuw zelfde CSV (leeg) aanmaken om in te schrijven Set objfile = objFSO.CreateTextFile(filenaam, True) 'Hier gebruike Write, niet Writeline 'Met 2 karakters inkorten. Enter (vbcrlf = 2 karakters lang) objfile.Write (Left(StrStream, Len(StrStream) - 2)) 'objfile.Write (1) objfile.Close End Sub |
Dankje! Het wil echter nog niet zo vlotten aangezien ik steeds 0 uit krijg op welke manier ik de de functie ook verander.quote:
Eigenlijk bedoelde ik SUMPRODUCT()quote:Op woensdag 27 april 2016 13:51 schreef Cikx het volgende:
[..]
Dankje! Het wil echter nog niet zo vlotten aangezien ik steeds 0 uit krijg op welke manier ik de de functie ook verander.
Is het mogelijk om als "criteria" in de SUMIF functie de functie IF(AND(A1>0;B1>0);1;0) te nemen? Alhoewel, dan kijkt die ook maar naar één cel, dus misschien iets als: IF(AND(A1:A2000>0;B1:B2000>0);1;0). Ben de draad kwijt
Ha interessant. Wat ik tot nu toe heb gaat ook via VBA, en stream gedoe ken ik wel maar gebruik het niet vaak dus ook niet meteen aan gedacht.quote:Op woensdag 27 april 2016 12:13 schreef The_vice het volgende:
[..]
Als je een beetje ervaring hebt met vba, dan je hele csv export doen via macro. En dan met stream read/write voorbeeld de text inlezen en dan iets van StrStream = left(StrStream, len(StrStream )-2)
en dan StrStream weer wegschrijven.
[ code verwijderd ]
(Wel eerst in VBA in -> References -> "Microsoft Scripting RunTime" aanvinken.)
Gelukt! Bedankt!quote:Op woensdag 27 april 2016 14:37 schreef qu63 het volgende:
[..]
Eigenlijk bedoelde ik SUMPRODUCT()
=SOMPRODUCT(--(A1:A2000<>"");--(B1:B2000<>""))
Door in de laatste stap het opnieuw te open (met zelfde filenaam), maar dan middels "ForWrite" wordt alles overschreven met de inhoud van je stream.quote:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | Sub RangeToArray() Dim myArray() As Variant Dim tempTekst As Variant Dim tekst As String myArray = Range("A1:D14") 'of welke range je hebt Dim i, j Dim kolommen Dim rijen kolommen = UBound(myArray, 2) rijen = UBound(myArray, 1) For i = 1 To rijen For j = 1 To kolommen 'variant naar string (Cstr) tekst = tekst & myArray(i, j) & ";" 'en andere gewenste opmaak Next j 'laatste ";" weghalen tekst = Left(tekst, Len(tekst) - 1) 'linefeed toevoegen tekst = tekst & vbCrLf Next i 'laatste linefeed weer weghalen tekst = Left(tekst, Len(tekst) - 2) 'en door naar je stream 'of "immediate window" Debug.Print tekst End Sub |
Na enig zoeken en testen heb ik een code gevonden die werkt:quote:Op vrijdag 29 april 2016 11:25 schreef Puckzzz het volgende:
Excel 2013 Engels.
Is er een manier om ervoor te zorgen dat de data die ik omzet naar een tabel altijd tot de laatste cel in die tabel gaat? Ik heb hier een macro voor maar de tabellen verschillen dus elke keer in het aantal regels.
De complete macro verzamelt verschillende tekst bestanden, laadt deze allemaal onder elkaar in 1 sheet, zet de data om naar kolommen en vervolgens zet ik die kolommen om naar een tabel.
Nu is het zo dat die lijsten elke keer verschillend zijn qua aantal regels. Uit voorzorg selecteer ik tot regel 10.000 voordat ik het omzet naar tabel. Maar daarna maak ik nog weer een overzicht in een pivot, die pivot telt natuurlijk al die lege regels ook mee. Dat kan ik uitzetten in het filter maar ik heb liever dat tijdens het omzetten naar tabel gewoon alle gevulde regels worden omgezet.
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
ActiveSheet.ListObjects.Add(xlSrcRange, Range("$A$1:$L$10000"), , xlYes).Name _
= "Table1"
De range zou ik dus graag aangepast hebben zodat ie elke keer de laatste cel met data van de tabel vindt.
quote:ActiveSheet.ListObjects.Add(xlSrcRange, Range([A1].End(xlDown), [A1].End(xlToRight)), , xlYes).Name = "Table1"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | Realisatie Norm Tijd % gehaald 8:06:00 8:00 8:00 100 8:02:00 8:00 8:01 99 8:01:00 8:00 8:02 98 8:03:00 8:00 8:03 97 11:01:00 8:00 8:04 96 7:26:00 8:00 8:05 95 7:09:00 8:00 8:06 94 6:55:00 8:00 8:07 93 6:35:00 8:00 8:08 92 6:35:00 8:00 8:09 91 6:51:00 8:00 8:10 90 8:30:00 8:00 8:11 89 7:00:00 8:00 8:12 88 8:13 87 8:14 86 8:15 0 |
Tijdstipquote:Op vrijdag 29 april 2016 18:35 schreef Modus het volgende:
^^Zijn de gegevens in kolom A en B een tijdstip of een tijdsduur?
In E2 zou dan zoiets moeten komenquote:
1 | =ALS(A2<=B2;100;VERT.ZOEKEN(A2;C:D;2;ONWAAR)) |
Zonder hier naar te kijken vanmorgen een scriptje gemaakt met FSO en dat werkte zoals ik wilde, dus ook zonder die laatste enter nu. Thanks. Als dat vinkje een vereiste is, neem ik aan dat het toen aanstond.quote:Op woensdag 27 april 2016 12:13 schreef The_vice het volgende:
(Wel eerst in VBA in -> References -> "Microsoft Scripting RunTime" aanvinken.)
Kan ook zijn dat een ander process het nog open had (bijv. preview in Windows Explorer.) Of dat tijdens debuggen het bestand nog niet goed was afgesloten.quote:
Als de formulerijen in alle 50 sheets écht op dezelfde adressen staan.quote:Op woensdag 23 maart 2016 10:59 schreef Doevelaer het volgende:
Wie weet of dit kan en hoe het dan werkt:
Ik wil graag opmaak, formules e.d. van het werkblad A naar werkblad B kopiëren, echter zonder dat de gegevens in werkblad B overschreven worden.
.......
Hm lastig, nog nooit eerder zoiets gedaan. Ik denk dat ik 2 opties heb om uit te werken:quote:Op vrijdag 29 april 2016 20:59 schreef The_vice het volgende:
Speciale karakters zijn vaak struikelpunten in code. Je wilt niet weten hoe vaak ik me blind zit te staren op dubbele spaties, Non-Breaking spaties etc. Wat ik soms dan doe is "vbLf" of chr(10) even tijdelijk vervangen door de tekst "[Linefeed]". En dan verderop weer terug omzetten Replace(.... "[Linefeed]" -->chr(10) ) o.i.d. Niet al te sjiek, maar zorgt er wel voor dat je weer verder kan.
Integendeel, lijkt me juist heel onlogisch dat die op het einde van de regel slaat en niet op een 'losse entry'. Heb je het al geprobeerd?quote:Op vrijdag 29 april 2016 19:44 schreef Modus het volgende:
Bij het inlezen van de csv kan ik nog een paar dingen instellen, zoals de seperator (werkt verder goed nu) en de line break, maar ik neem aan dat die slaat op einde van de hele regel en niet op 1 'losse entry'.
Ja. Hij liep vast op de 2e regel in de csv (dus de 1e regel met data). Toen gezorgd dat de cel die daarbij hoort geen line breaks had, en opnieuw geprobeerd. Toen begon de appl. te miepen over hetzelfde item, maar dan 1 regel lager. De meldingen die die app. geeft zijn nogal summier, maar geeft wel aan welke regel (en welk item op die regel) van de csv problemen geeft.quote:Op vrijdag 29 april 2016 22:09 schreef ralfie het volgende:
[..]
Integendeel, lijkt me juist heel onlogisch dat die op het einde van de regel slaat en niet op een 'losse entry'. Heb je het al geprobeerd?
Heb je notepad++? Daarin kan je met knop "¶" (Show all characters) controleren wat in je csv zit (of terecht is gekomen).quote:Op vrijdag 29 april 2016 22:17 schreef Modus het volgende:
[..]
Ja. Hij liep vast op de 2e regel in de csv (dus de 1e regel met data). Toen gezorgd dat de cel die daarbij hoort geen line breaks had, en opnieuw geprobeerd. Toen begon de appl. te miepen over hetzelfde item, maar dan 1 regel lager. De meldingen die die app. geeft zijn nogal summier, maar geeft wel aan welke regel (en welk item op die regel) van de csv problemen geeft.
Is gratis te downloaden en ook als portable van usb stick te draaien, mocht je niet kunnen installeren.quote:
Kan wel kloppen, de Array is als een Variant gedefinieerd, die zal dus zelfstandig nummer afronding toepassen, als een waarde numeriek is. In je directe opgeslagen CSV wordt het aantal cijfers achter de komma zoals je in Excel hebt ingesteld (per veld) als tekst opgeslagen.quote:Verder moeten ingevoerde getallen altijd 3 cijfers achter de komma hebben voor de app. Mijn eerste versie deed dat zonder problemen, maar jouw script door elke cel uit te lezen naar een tekststring pakt die niet, ondanks ingestelde veldsettings. Moet ik ook nog uitzoeken.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | For j = 1 To kolommen 'met aangepaste formatting 'rij 1 is header in voorbeeld, 'vanaf kolom 2 data If j > 1 And i > 1 Then 'format "#,##0.00" naar wens tekst = tekst & _ Format(myArray(i, j), "#,##0.00") _ & ";" Else tekst = tekst & myArray(i, j) & ";" End If 'en andere gewenste opmaak Next j |
iig wel VBA: https://support.microsoft.com/en-us/kb/2815384quote:Op zaterdag 30 april 2016 13:56 schreef Janneke141 het volgende:
Is er een formule om het aantal cellen in een reeks te tellen met een bepaalde opmaak?
Een collega van mij is zo slim geweest om een heel schema te maken met gekleurde vakjes zonder waarde...
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |