Sivu 2/3

Lähetetty: 03 Elo 2006, 21:15
Kirjoittaja larus
Ymmärsin yskän. Testatkaa toimiiko tämä paremmin:

Sub TIIRAN_HAVIKSET_TYHJIENSOLUJENTAYTTO()
'Lauri Nikkinen 20.7.2006
'Makro olettaa, että täytettävät solut alkavat laji-muuttujasta, joka on saraakkeessa B
Range("B1").Select
Selection.AutoFilter
Selection.AutoFilter Field:=2, Criteria1:="<>"
Selection.SpecialCells(xlCellTypeBlanks).Select
Selection.FormulaR1C1 = "."
Selection.AutoFilter Field:=2

Do
'Hakee B1-sarakkeesta ensimmäisen solun, joka on ennen tyhjää solua
Range("B1").End(xlDown).Select

'Valitsee täytettävän solualueen
Set LeftCell = Cells(ActiveCell.Row, 2)
Set RightCell = Cells(ActiveCell.Row, 256)

If IsEmpty(LeftCell) Then Set LeftCell = LeftCell.End(xlToRight)
If IsEmpty(RightCell) Then Set RightCell = RightCell.End(xlToLeft)
If LeftCell.Column = 256 And RightCell.Column = 2 Then ActiveCell.Select Else Range(LeftCell, RightCell).Select
Range(Selection, Selection.End(xlDown)).Select

'Solualueen täyttö

'Tämän kohdan koodaajat alla
'Tom Ogilvy, 1999/12/14 programming
'Revised David McRitchie, 2000-11-25 programming
Application.ScreenUpdating = False
Application.Calculation = xlManual
Dim cell As Range
For Each cell In Intersect(Selection, _
ActiveSheet.UsedRange)
If Trim(cell) = "" And cell.Row > 1 Then
cell.NumberFormat = cell.Offset(-1, 0).NumberFormat
cell.Value = cell.Offset(-1, 0).Value
End If
Next cell
Application.Calculation = xlAutomatic 'xlCalculationAutomatic
Application.ScreenUpdating = False

'Looppi kunnes tulee tyhjä solu A-sarakkeessa
Loop Until IsEmpty(ActiveCell.Offset(1, 0))

Cells.Replace What:=".", Replacement:="", LookAt:=xlPart, SearchOrder:= _
xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

End Sub


t. Lauri Nikkinen

OK

Lähetetty: 04 Elo 2006, 08:09
Kirjoittaja jjuju
Nyt nopealla testauksella näyttäisi toimivan. KIITOS!

Pekalle: siinä virheellisessä makrossa (esimerkkitiedosto) punavarpusriville tulee atlaskoodi "73" ja lisätietoihin "ruokkivat maastopoikasia". Nämä tiedot tulivat ylemmän rivin "tyhjän" västäräkin tiedoista.

Lähetetty: 04 Elo 2006, 08:30
Kirjoittaja Vieras
Tässä vielä ohjeet tämän skriptin käyttöön:

1. Avaa excel ja tuo siihen omat haviksesi tiirasta (id-sarake A sarakkeeseen)
2. Paina alt+F11 -> Visual Basic Editor avautuu
3. Visual Basic Editorissa Valitse insert -> module
4. Jos moduuli ei ole tyhjä (lukee esim. Option Explicit), tyhjennä se kaikesta tekstistä, ja pastaa koodipätkä tähän moduuliin. Jos tyhjä, pastaa koodi moduuliin.
5. Maalaa koodipätkä kokonaisuudessa ja paina F5 ( tai vihreää > kuvaketta ylärivillä) -> siirry excelin puolelle ja kato mitä tapahtui vai tapahtuiko mitään...

t. Lauri Nikkinen

Lähetetty: 04 Elo 2006, 09:20
Kirjoittaja jjuju
Nyt testaili vähän lisää ja huomaan, että itse makro toimii oikein. Ongelma onkin Tiirasta tuodun tiedoston "rakenteessa". Nyt makroon pitäisi tehdä hieman lisäehtoja, jotta se toimisi täydellisesti.

Esimerkki: http://jjuju.net/Malli1.xls

Tiedostossa on kalalokkihavainto kahdella rivillä:
ensin nuoret linnut (solu X="1kv") ja seuraavalla rivillä vanhat (solu W="ad"). Koska tuo toinen rivi on ns. tyhjä rivi, makro täyttää sen soluja ylemmän rivin mukaan. Tulos: soluun X täytetään "1kv", kun solussa W on jo "ad". Huomaatteko mitä tarkoitan. Virhe on pieni, eikä ehkä haittaa, mutta minua se kiusaa.

Lähetetty: 10 Elo 2006, 15:16
Kirjoittaja PekkaS
jjuju kirjoitti:Tiedostossa on kalalokkihavainto kahdella rivillä:
ensin nuoret linnut (solu X="1kv") ja seuraavalla rivillä vanhat (solu W="ad"). Koska tuo toinen rivi on ns. tyhjä rivi, makro täyttää sen soluja ylemmän rivin mukaan. Tulos: soluun X täytetään "1kv", kun solussa W on jo "ad". Huomaatteko mitä tarkoitan. Virhe on pieni, eikä ehkä haittaa, mutta minua se kiusaa.
Auttaisiko tämä:

Sub TIIRAN_HAVIKSET_TYHJIENSOLUJENTAYTTO()
'Versio 1.01 10.8.2006
'
'Lauri Nikkinen 20.7.2006
'Sarkealueen rajaus Pekka Suopajärvi 10.8.2006
'
'Makro olettaa, että täytettävät solut alkavat laji-muuttujasta, joka on saraakkeessa B ja päättyät salaus-muuttujaan sarakkeessa R

Range("B1").Select
Selection.AutoFilter
Selection.AutoFilter Field:=2, Criteria1:="<>"
Selection.SpecialCells(xlCellTypeBlanks).Select
Selection.FormulaR1C1 = "."
Selection.AutoFilter Field:=2

Do
'Hakee B1-sarakkeesta ensimmäisen solun, joka on ennen tyhjää solua
Range("B1").End(xlDown).Select

'Valitsee täytettävän solualueen
Set LeftCell = Cells(ActiveCell.Row, 2)
Set RightCell = Cells(ActiveCell.Row, 256)

If IsEmpty(LeftCell) Then Set LeftCell = LeftCell.End(xlToRight)
If IsEmpty(RightCell) Then Set RightCell = RightCell.End(xlToLeft)
If LeftCell.Column = 256 And RightCell.Column = 2 Then ActiveCell.Select Else Range(LeftCell, RightCell).Select
Range(Selection, Selection.End(xlDown)).Select

'Solualueen täyttö

'Tämän kohdan koodaajat alla
'Tom Ogilvy, 1999/12/14 programming
'Revised David McRitchie, 2000-11-25 programming
Application.ScreenUpdating = False
Application.Calculation = xlManual
Dim cell As Range
For Each cell In Intersect(Selection, _
ActiveSheet.UsedRange)
' Täyttää vain sarakkeeseen 18 (R) saakka
If Trim(cell) = "" And cell.Row > 1 And cell.Column <= 18 Then
cell.NumberFormat = cell.Offset(-1, 0).NumberFormat
cell.Value = cell.Offset(-1, 0).Value
End If
Next cell
Application.Calculation = xlAutomatic 'xlCalculationAutomatic
Application.ScreenUpdating = False

'Looppi kunnes tulee tyhjä solu A-sarakkeessa
Loop Until IsEmpty(ActiveCell.Offset(1, 0))

Cells.Replace What:=".", Replacement:="", LookAt:=xlPart, SearchOrder:= _
xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Selection.AutoFilter
Cells(1, 1).Select
End Sub

Yes!

Lähetetty: 11 Elo 2006, 06:02
Kirjoittaja jjuju
Nyt vaan paranee ja kelpaa tällaisenaan. Toivottavasti en enää löydä "puutteita".

Lähetetty: 11 Elo 2006, 08:29
Kirjoittaja Vieras
Osaajat voivat kehittää skriptiä edelleen, jos tarvetta tulee. Laittakaa uudet versiot tähän ketjuun.

t. Lauri

makro ei toimi?

Lähetetty: 03 Kesä 2007, 23:23
Kirjoittaja pepe
Olin kokoamassa Tiiran kautta Tringan tulevaa syyskatsausta ja ajaessani yllä olevaa makroa yllättäen excel herjaa:

Run-time error '13':
Type mismatch

Valitessa 'debug' Visual Basic osoittaa virheen olevan seuraavalla rivillä:

If Trim(cell) = "" And cell.Row > 1 And cell.Column <= 18 Then

Excel taulukkoon ilmestyy myös piste (.) kaikkiin tyhjiin kenttiin ja ensimmäisen rivin jokaiseen soluun ilmestyy alasvetovalikko.

Osaako joku sano mistä kiikastaa? Aiemmilla (viime talvena) Tiirasta ladatuilla csv-tiedoistoilla makro toimii niinkuin pitää.

Epätietoinen Espoosta,

Pepe

Lähetetty: 04 Kesä 2007, 00:04
Kirjoittaja pepe
Jaksoin vielä tutkailla ongelmaa tarkemmin ja huomasin että vika tuntuu olevan rivien määrässä. 400 riviä tuntuu olevan maksimi mitä makro jaksaa kerralla tehdä.

Onko muilla vastaavia ongelmia, tuntuu melko työläältä ja tyhmältä ajaa Tringan 10000 rivin tiedostoa 400 rivin pätkissä?

Pepe

Re: makro ei toimi?

Lähetetty: 04 Kesä 2007, 09:49
Kirjoittaja PekkaS
pepe kirjoitti:Olin kokoamassa Tiiran kautta Tringan tulevaa syyskatsausta ja ajaessani yllä olevaa makroa yllättäen excel herjaa:

Run-time error '13':
Type mismatch
Pepe
Terve,

Veikkaisin, että vika on siinä, että lataamassasi datassa on lisätietokentässä jotakin semmoista mistä Excel pillastuu. Virheilmoituksen saa aikaan esimerkiksi jos jokin kenttä alkaa plus-merkillä. Makro kyllä toimii rivimäärästä riippumatta.

Miten tämä sitten on kierrettävissä? Avattaessa tiedostoa Exceliin kaikki käyttäjän vapaasti syöttämät tiedot tulisi määrittää tekstityyppisiksi (ks kohta 10).

Täydennetäänpäs vähän aiemmin esitettyä latausohjetta...

CSV-tiedoston lataus Exceliin, versio 1.01 04.06.2007
0 Avaa tietokone, avaa nettiselain, kirjaudu Tiiran sivuille
1 Tee joku haku, jossa haet joko omia havaintoja tai omia ilmoituksia (rasti perushaussa tai laajassa haussa kyseisiin ruutuihin). Esimerkiksi, klikkaa Selain-ikkunan vasemmasta laidasta "Perushaku" ja valitse sen jälkeen "Omat Ilmoitukset", "Omat Havainnot" ja aikaikkunaksi alimmainen vaihtoehto "päivämäärä" ja jätä molemmat päivämääräkentät tyhjiksi ja paina "Hae".
2 Kun haku on tehty, havaintojen yläpuolella on linkki "Lataa havainnot csv:nä" - klikkaa kyseistä linkkiä. Eteesi pitäisi ilmestyä (hivenen selaimen turva-asetuksistasi riippuen) laatikko, jossa ehdotetaan joko avaamaan tai tallentamaan ladattu tiedosto. Valitse tallenna/save ja tallenna tiedosto jonnekin järkevään paikkaan järkevällä nimellä.
3 Avaa Excel
4 Valitse Tiedosto/File valikosta komento Avaa/Open
5 Eteesi avautuu valintaikkuna, jonka alalaidassa on laatikko Tiedostotyyppi/Files of type. Tuosta laatikosta valitse Kaikki tiedostot/All Files (*.*)
6 Hyppele ikkunan hakemistotyökaluilla hakemistoon johon Tiirasta tallensit tiedoston.
7 Valitse tallentamasi tiedosto ja klikkaa Avaa/Open
8 Eteesi avautuu uusi ikkuna, jossa ylimpänä on valinta tiedoston tyypistä. Valitse ylempi vaihtoehto Erotinmerkki/Delimited ja paina sen jälkeen Seuraava/Next -nappia.
9 Nyt pitää valita mitä erotinta käytetään. Tiirassa erotinmerkki on #, joka löytyy vaihto-näppäimellä numeron 3 näppäimestä. Syötä tämä merkki kohtaan Muu erotin/Other ja varmista, että Muu-erotin ikkunassa on rasti, ja poista rastit mahdollisesti muista erotinmerkeistä. Paina Seuraava / Next
10 Seuraavaksi voit määritellä, millaista dataa kukin kenttä sisältää. Excel osaa tehdä tämän automaattisesti, mutta sekoilee parissa kohden. Lisäksi Excel sekoaa, jos kenttä alkaa vaikkapa plus-merkillä, joten muutama kenttä pitää sen vuoksi määritellä varmuuden vuoksi tekstiksi.
Valitse sarake:
- Sarake PVM1 ja muuta ikkunan ylälaidassa olevasta sarakkeen tietotyypiksi Päiväys/Date ja siitä vielä muoto DMY.
- Sarake PVM2 toimi kuten edellisen kanssa
- Sarake Lisätietoja (löytyy siirtämällä alalaidassa olevaa vierityspalkkia oikealle), muuta tietotyypiksi Teksti/Text
- Sarake Ikä, muuta tietotyypiksi Teksti/Text
- Sarake Lisätietoja_2, muuta tietotyypiksi Teksti/Text
Muiden sarakkeiden asetuksiin ei (todennäköisesti) ole tarvetta puuttua.
Periaatteessa kuitenkin seuraavissakin kentissä saattaa olla kentän alussa erikoismerkki.
- Sarake Paikka, muuta tietotyypiksi Teksti/Text
- Sarake Havainnoijat, muuta tietotyypiksi Teksti/Text
- Sarake Tila, muuta tietotyypiksi Teksti/Text

11 Muutettuasi em. sarakeasetukset, klikkaa Valmis/Finish

Toivottavasti kukaan ei saa päähänsä syöttää #-merkkiä mihinkään kenttään, sitten siirto Exceliin käy vaikeaksi...

T. Pekka Suopajärvi

Lähetetty: 04 Kesä 2007, 19:32
Kirjoittaja pepe
Tuhannet kiitokset! Nyt toimii kuin hirvi.

-pepe

Lähetetty: 04 Joulu 2007, 10:20
Kirjoittaja JaniV
Terve!
Olen yrittänyt saada täytetyksi taulukon tyhjiä soluja annettujen ohjeiden mukaan siinä kuitenkaan onnistumatta. Eli olen ladannut havainnot exceliin, avannut Visual Basic Editorin, kopioinut ja liittänyt sinne tuon annetun koodipätkän. Kun painan F5, tulee vain ilmoitus ”Compile error: named argument not found”. Koodipätkässä on maalautuneena lopussa oleva osa “SearchFormat:=”. Missähän mahtaa mennä pieleen? Olen yrittänyt tehdä tuota useilla erilaisilla havaintolistauksilla ja aina tulee sama ilmoitus. En ole ikinä aiemmin käyttänyt tuota Visual Basic Editoria, joten vikaakaan en osaa etsiä. Jos joku osaa auttaa, niin ohjeet mahdollisimman rautalangasta väännettynä.
t: Jani

Lähetetty: 08 Joulu 2007, 12:36
Kirjoittaja PekkaS
En ehdi tutkiskelemaan nyt tarkemmin, mutta kokeilepas vaikka tätä:

Cells.Replace What:=".", Replacement:="", LookAt:=xlPart, SearchOrder:= _
xlByRows, MatchCase:=False,

Eli poista teksti
SearchFormat:=False, ReplaceFormat:=False

- PekkaS -

Lähetetty: 09 Joulu 2007, 11:28
Kirjoittaja JaniV
Kiitos, tuo koodi-pätkän poistaminen auttoi täyttämään solut.

Pikaisella tarkastuksella löytyi sellainen pieni ongelma, että lisätieto-kentistä hävisi pisteet. Pilkut ja muut välimerkit näyttivät säilyvän. Lisäksi yhdessä havainnossa, missä oli syötetty eri riveille pariutuneet emot ja toiselle maastopoikaset, oli kopioitunut myös poikasille tuo 'pariutuneet'. Johtuneeko nämä ongelmat sitten tuosta poistetusta koodi-pätkästä?

t: JaniV

Lähetetty: 10 Joulu 2007, 13:52
Kirjoittaja PekkaS
Hei,

Ei pitäisi johtua. Lähetätkö Tiirasta lataamasi havainnot minulle sähköpostilla (laitoin osoitteen Tiira-foorumin "yksityisviestinä")

- Pekka -