Excel guruille makrohaaste, jota en itse osaa

Kirjanpitotapahtumat ovat excelillä.

Sovitaan, että minulla on sarakkeessa A kirjanpidon tilejä allekkain n 1000 riviä

Miten teen makron, joka aloittaa A1:stä testaa oleva kirjanoidon tili välillä esim 100-200 ja jos on niin korvaa sisällön sanalla hallinto, jos taas A1 on tili välillä 200-300 se merkitsee käyttä ja huolto eli korvaa kirjanpidon tilit sanoilla

ja kävisi koko kirjanpidon 1000 riviä läpi ja korvaisi tilinumeroita sanoilla. esim hallinto 100-200, käyttä ja huolto 200-300 ulkoalueiden hoito 300-400 jne koko sarakkeen loppuun asti korvaten tilinumerot sanoilla, joita voin sitten välisummilla suodatella ja laskea kulukohtaisesti
1975
Äänestä

Muut lukivat myös

Vastaukset 19

Vanhimmat

Jos nyt oikein ymmärsin tarkoituksesi, niin alla on linkki excel-kuvaan, jossa "temppu" tehdään ilman makroa.
http://aijaa.com/jHXjpm

Äänestä

odotellaan kannymanin vastausta.
kannyman on ollut koulussa ja saanut atk-ajokortinkin, vai onko?

Äänestä

En ole excelguru, joten ryhmittäisin koko taulukon uudelleen pistämällä sen A-sarakkeen mukaiseen numerojärjestykseen, jolloin taulukon sisältö näkyisi kuluryhmittäin. Jättäisin alkuperäiset tilinumerot näkyviin (jos niillä on jatkossakin jotain merkitystä) ja lisäisin A:n eteen oman sarakkeen kuluryhmien nimille (hallinto...ym). (ehkä vielä värittäisin kuluryhmille erisävyiset taustavärit). Lisäisin vielä loppuun yhteenlaskusummien viereen sarakkeen, joka kerää välisummia ryhmittäin.Tästä olisi helppo ilman suodatuksiakin tarkkailla ryhmittäin kuluja, koska kokonaiskuva näkyy koko ajan.
Ryhmien ja niiden summien perusteella olisi helppo laatia kaavio (piirakka tms), jolla eri ryhmien kulut piirtyy kuvaksi.

Äänestä

Kiitos erinomaisista ratkaisuehdotuksista. Ongelmalliseksi tiliasian tekee se, että tiliajo ajetaan melko usein suoraan kirjanpitojärjestelmästä csv:nä exceliin.

Olisi helpompaa, jos takana olisi makro, sillloin osoittaisi vain jonkin solun ja makro lähtisi muuttamaan tilinumeroita vastaaviksi tilinimiksi, kunnes tyhjä solu saavutetaan

Äänestä
  • Sub koe()
       R = 1
       Do
          Tili = Cells(R, 1).Value
          If Tili = "" Then Exit Do
          If Tili >= 100 And Tili < 200 Then
             Cells(R, 1) = "hallinto"
          ElseIf Tili >= 200 And Tili < 300 Then
             Cells(R, 1) = "huolto"
          ElseIf Tili >= 300 And Tili < 400 Then
             Cells(R, 1) = "ulkoalueiden hoito"
          Else
             Cells(R, 1) = "virhe"
          End If
          R = R 1
       Loop
    End Sub

    Äänestä

Erittäin suuri kiitos, toimii kuin Sveitsiläinen kello. Tuosta saa muokkaamalla todella näppärän makron. Toivotaan, että auttaa muitakin, tuollahan voi korvata muitakin, kuin tilejä.

Kiitos ja kumarrus avusta.

Äänestä
  • Muuten osaan muuttaa koodia, mutta miten tuota pitäisi muuttaa, että aloittaisi tilien muuntamisen sanoiksi aina valitusta solusta eli ensin valitsen solun ja sitten ajan makron ja se alkaisi siitä ajaa ajon tilien loppuun asti ?

    Äänestä

  • petexi kirjoitti:

    Muuten osaan muuttaa koodia, mutta miten tuota pitäisi muuttaa, että aloittaisi tilien muuntamisen sanoiksi aina valitusta solusta eli ensin valitsen solun ja sitten ajan makron ja se alkaisi siitä ajaa ajon tilien loppuun asti ?

    Alkuun
    R = Selection.Row

    Äänestä

  • Tämmöinen kirjoitti:

    Alkuun
    R = Selection.Row

    Valitetteávasti ei toiminut , vaikka liitin tuon alkuun. Koodi alla:





    Sub Tilinumerot_nimekkeiksi()

    R = Selection.Row


    Do

    Tili = Cells(R, 1).Value

    If Tili = "" Then Exit Do

    If Tili >= 100 And Tili < 200 Then

    Cells(R, 1) = "Hallinto"


    ElseIf Tili >= 200 And Tili < 300 Then

    Cells(R, 1) = "Huolto"

    ElseIf Tili >= 300 And Tili < 400 Then

    Cells(R, 1) = "Ulkoalueiden hoito"

    Else

    Cells(R, 1) = "Tuntematon tili"
    MsgBox "Löytyi tuntematon tili, korjaisitko ?"

    End If

    R = R 1

    Loop

    End Sub

    Äänestä

  • Ihme ja kumma , mikään koodissa ei muuttunut, vaikka laitoin alkuun tuon
    "R = Selection.Row", edelleen laski A solusta. Aika kummallista, paljoa en koodista ymmärrä, mutta ei siinä ole enää viittausta a sarakkeeseen ...Olisiko mahdollista saada koko toimiva koodi. Muutenhan tuo toimii loistavasti, mutta sen pitäisi aloittaa aina valitusta solusta alaspäin.

    Äänestä

  • petexi kirjoitti:

    Ihme ja kumma , mikään koodissa ei muuttunut, vaikka laitoin alkuun tuon
    "R = Selection.Row", edelleen laski A solusta. Aika kummallista, paljoa en koodista ymmärrä, mutta ei siinä ole enää viittausta a sarakkeeseen ...Olisiko mahdollista saada koko toimiva koodi. Muutenhan tuo toimii loistavasti, mutta sen pitäisi aloittaa aina valitusta solusta alaspäin.

    Merkintä Cells(R,1) tarkoittaa solua rivillä R ja sarakkeessa 1. (Myös tämä käy: Cells(R, "A") ).

    Laittamasi koodi toimii oikein, eli se alkaa tarkistuksen vasta sillä hetkellä aktiivisena olevalta riviltä. Kenties sinulla on koodista kaksi versiota ja kutsut sitä ensimmäistä (alkuperäinen Koe ja ja muokattu Tilinumerot_nimekkeiksi).

    3pointsin Select Case -koodi on sievempi. Koodi ei toimi, koska siinä tilinumeron sijasta testataan rivinumeroa. Siis, rivin
    Select Case ActiveCell.Row
    tilalle tulee
    Select Case ActiveCell.Value

    Lisäksi valitun solun pitää olla A-sarakkeesta, muutoin testatan ja muutetaan väärää tietoa. Alkuun on hyvä lisätä rivi, joka varmistaa, että ollaan A-sarakkeessa:
    Cells(ActiveCell.Row, "A").Select

    Aktiivisen solun hyppyytäminen hidastaa koodia, vaikka tässä tapauksessa sillä ei liene käytännön merkitystä.

    Äänestä

  • Kokeilin tällä koodilla, mutta ei toimi, kuin A sarakkeessa. Jos vien hiiren vaikka D sarakkeeseen ja týritän ajaa ohjelmaa, ei tapahdu mitään. Poistin kaikki vanhat makrot ja pitäydyin täysin sinun veriossasi, mutta ei toimi...kummallista...alla koodi, jota käytin

    Sub koe()

    R = Selection.Row

    R = 1

    Do

    Tili = Cells(R, 1).Value

    If Tili = "" Then Exit Do

    If Tili >= 100 And Tili < 200 Then

    Cells(R, 1) = "hallinto"

    ElseIf Tili >= 200 And Tili < 300 Then

    Cells(R, 1) = "huolto"

    ElseIf Tili >= 300 And Tili < 400 Then

    Cells(R, 1) = "ulkoalueiden hoito"

    Else

    Cells(R, 1) = "virhe"

    End If

    R = R 1

    Loop

    End Sub

    Äänestä

  • petexi kirjoitti:

    Kokeilin tällä koodilla, mutta ei toimi, kuin A sarakkeessa. Jos vien hiiren vaikka D sarakkeeseen ja týritän ajaa ohjelmaa, ei tapahdu mitään. Poistin kaikki vanhat makrot ja pitäydyin täysin sinun veriossasi, mutta ei toimi...kummallista...alla koodi, jota käytin

    Sub koe()

    R = Selection.Row

    R = 1

    Do

    Tili = Cells(R, 1).Value

    If Tili = "" Then Exit Do

    If Tili >= 100 And Tili < 200 Then

    Cells(R, 1) = "hallinto"

    ElseIf Tili >= 200 And Tili < 300 Then

    Cells(R, 1) = "huolto"

    ElseIf Tili >= 300 And Tili < 400 Then

    Cells(R, 1) = "ulkoalueiden hoito"

    Else

    Cells(R, 1) = "virhe"

    End If

    R = R 1

    Loop

    End Sub

    Tarkoitin, että korvaisit rivin R = 1 rivillä R = Selection.Row

    Muuttujaa R käytetään rivilosoittimena. Se saa koodissasi ensin oikean alkuarvon, mutta heti seuraavalla rivillä laitat sen arvoksi ykkösen. Tämä rivi on poistettava. Muuten edellisellä rivillä ei ole meritystä.

    Äänestä

Tämä aloittaa valitusta solusta.

Sub Main
do while activecell.value<>""
select case activecell.row
case 100 to 199
activecell.value="hallinto"
case 200 to 299
activecell.value="käyttö ja huolto"
case 300 to 399
activecell.value= "ulkoalueiden hoito"
end select
activecell.offset(1,0).select

loop
End Sub

Äänestä
  • Yritin tätä, mutta ei tehnyt muuta kuin hyppäsi rivin loppuun.

    Äänestä

  • Sub Main
    dim solu as range
    set solu=activecell
    print solu.address
    do
    select case solu.value
    case 100 to 199
    solu.value="hallinto"
    case 200 to 299
    solu.value="huolto"
    case 300 to 399
    solu.value= "ulkoalueiden hoito"
    case else exit do
    end select
    set solu=solu.offset(1,0)
    loop
    End Sub

    Äänestä

  • Moi

    Yritin tätä, mutta ohjelman ajo loppui johonkin virheilmoitukseen, josta kuvakaappaus liitteenä:

    [url]http://aijaa.com/rQeDLy[/url]

    Äänestä

  • Sub Main

    dim solu as range

    set solu=activecell

    do while solu.value<>""

    select case solu.value

    case 100 to 199

    solu.value="hallinto"

    case 200 to 299

    solu.value="huolto"

    case 300 to 399

    solu.value= "ulkoalueiden hoito"

    end select

    set solu=solu.offset(1,0)

    loop

    End Sub

    Äänestä

  • Bingo !!!

    Kiitos paljon. Tämä toimi juuri kuten pitää ja on helppoa ylläpitää. Tuo toinen koodi ei ainakaan minulla valitettvasti toiminut, mutta iso kiitos kaikille ongelman ratkaisusta. Tämä on hellppo ja selkeä koodi muihin vastaaviin tarpeisiin Excelissä

    Äänestä

Kommentoi aloitusta


petexi kirjoitti:

Kirjanpitotapahtumat ovat excelillä.

Sovitaan, että minulla on sarakkeessa A kirjanpidon tilejä allekkain n 1000 riviä

Miten teen makron, joka aloittaa A1:stä testaa oleva kirjanoidon tili välillä esim 100-200 ja jos on niin korvaa sisällön sanalla hallinto, jos taas A1 on tili välillä 200-300 se merkitsee käyttä ja huolto eli korvaa kirjanpidon tilit sanoilla

ja kävisi koko kirjanpidon 1000 riviä läpi ja korvaisi tilinumeroita sanoilla. esim hallinto 100-200, käyttä ja huolto 200-300 ulkoalueiden hoito 300-400 jne koko sarakkeen loppuun asti korvaten tilinumerot sanoilla, joita voin sitten välisummilla suodatella ja laskea kulukohtaisesti

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu