Määrätyn solualueen tulostaminen pdf-sivuna

Kalenterikalle

Otin käyttöön vanhan, mutta edelleen toimivan Excel-lomatuurauskalenterin, jolle olisi kysyntää.

Tässä alkutiedot kalenterista:
Koko vuoden (52 vk) kattava solualue on iso, eli B2-NE40, mutta kerralla ruudulla näkyvä alue on 31 saraketta ja 40 riviä, josta ensimmäiset 4 saraketta A-D on lukittu paikalleen, ja sarakkeet E-NE liukuu vaakasuunnassa ns. "mattona" lukitun alueen alle niin, että vain työstettävä 28 sarakkeen kenttä (4 vk) kerrallaan näkyy.
A-sarake ja 1. rivi ovat marginaaleja, eivätkä näyttele mitään muuta roolia.

Varsinainen kysymykseni kuuluukin, miten saan tulostettua vaakasuunnassa yhdelle pdf:lle, kun tulostettava alue olisi AINA sama, eli alkaen aina solusta B2 31 saraketta ja B2 39 riviä.
Onko tuossa nyt sitten kyseessä absoluuttisen vai suhteellisen alueen tulostamisesta, kun osa alueesta pysyy vakiona ja osa alueesta vaihtuu?

Jos tuon ajatukseni saisi VB-koodilla, niin osaisin hieman jopa hahmottaa miten se tapahtuu.

13

255

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Kalenterikalle

      Korjaus,
      Varsinainen kysymykseni kuuluukin, miten saan tulostettua vaakasuunnassa yhdelle pdf:lle, kun tulostettava alue olisi AINA sama, eli alkaen aina solusta B2 30 saraketta ja B2 39 riviä.

    • ctrl_c__ctrl_v

      Tee uusi tiedosto noilla tiedoilla ja tallenna se pdf.

    • Kalenterikalle

      Jäi mainitsematta, että jos tuon saisi siis VB:llä toteutettua, niin sille voisi luoda napin jolla kätevästi tulostaisi tuon pdf:n. Toki tiedän ja osaankin tehdä tuon ns. perinteisellä copy-pastettamallakin, mutta siinä pitää edelleen säätää ja viritellä muotoilut ym.. eli ei kätevä VB:llä painonapilla tehtyyn verrattuna. Kiitos kuitenkin vinkistä, mutta ei tällä kertaa houkutteleva vaihtoehto.

      • Tämmöinen

        Valitse tulostimeksi käyttämäsi PDF-printteri. Aja MikäPrintteri-makro ja laita sen ilmoittama nimi Printterin arvoksi Tulosta-makroon:

        Sub MikäPrintteri()
            MsgBox Application.ActivePrinter
        End Sub

        Sub Tulosta()
            Printteri = "PDF-XChange Printer 2012 on Ne01:"
            Application.ActivePrinter = Printteri
            ActiveSheet.PageSetup.PrintArea = Range("B2:AO32")
            ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
        End Sub


      • Kalenterikalle

        Kiitos "Tämmönen" vastauksesta ja ehdotuksestasi. En nopeasti kokeillen saanut tulostettua kuin kapean kaistaleen taulukostani. Voisitko hieman avata vaiheita, mitä koodillasi pitäisi tapahtua missäkin kohtaa. Auttaisi hahmottamaan työn kulkua.
        Ajatuksenihan oli, että saisin aina tulostettua saman alueen, vaikka osa sarakkeista "liukuukin" lukittujen sarakkeiden alle. Pitäisikö sinun koodisi toimia juuri näin?


      • väärinpäin
        Kalenterikalle kirjoitti:

        Kiitos "Tämmönen" vastauksesta ja ehdotuksestasi. En nopeasti kokeillen saanut tulostettua kuin kapean kaistaleen taulukostani. Voisitko hieman avata vaiheita, mitä koodillasi pitäisi tapahtua missäkin kohtaa. Auttaisi hahmottamaan työn kulkua.
        Ajatuksenihan oli, että saisin aina tulostettua saman alueen, vaikka osa sarakkeista "liukuukin" lukittujen sarakkeiden alle. Pitäisikö sinun koodisi toimia juuri näin?

        Veikkaisin että tekee lähes sen mitä pyysit, "eli alkaen aina solusta B2 30 saraketta ja B2 39 riviä".

        Tosin jos B-sarakkeeseen lisätään 30 saraketta, niin ollaan sarakkeessa AF, ja 2-riville 39 riviä, niin rivillä 40. Eli tuon koodissa olevan alueen muuttaisin muotoon "B2:AF40".

        Jos taas haluat tulostaa aina tietyn kokoisen alueen jostain solusta alkaen, niin helpoimmalla pääsee tekemällä makron, joka tekee edellisen koodin jutut, mutta alue on joku tyyliin "ActiveCell.Offset(39,30)". Tuolloin alueen vasen ylänurkka pitää aina valita hiirellä tai muulla tavalla, ja sitten ajetaan makro.


      • väärinpäin
        väärinpäin kirjoitti:

        Veikkaisin että tekee lähes sen mitä pyysit, "eli alkaen aina solusta B2 30 saraketta ja B2 39 riviä".

        Tosin jos B-sarakkeeseen lisätään 30 saraketta, niin ollaan sarakkeessa AF, ja 2-riville 39 riviä, niin rivillä 40. Eli tuon koodissa olevan alueen muuttaisin muotoon "B2:AF40".

        Jos taas haluat tulostaa aina tietyn kokoisen alueen jostain solusta alkaen, niin helpoimmalla pääsee tekemällä makron, joka tekee edellisen koodin jutut, mutta alue on joku tyyliin "ActiveCell.Offset(39,30)". Tuolloin alueen vasen ylänurkka pitää aina valita hiirellä tai muulla tavalla, ja sitten ajetaan makro.

        "joku tyyliin "ActiveCell.Offset(39,30)""

        Tai ei siis noin, koska tuo valitsee vain alueen oikean alanurkan. Ehkä pitää tehdä uusi range:

        Dim rng as Range
        Set rng = ActiveCell.Resize(39,30)

        Tuupata toi rng sitten PrintAreaksi.

        Resizestä: http://www.homeandlearn.org/the_resize_property.html


    • Kalenterikalle

      "väärinpäin "
      #Tosin jos B-sarakkeeseen lisätään 30 saraketta, niin ollaan sarakkeessa AF, ja 2-riville 39 riviä, niin rivillä 40. Eli tuon koodissa olevan alueen muuttaisin muotoon "B2:AF40".#

      - Totta, tarkkana saa olla. Laskiessani sarakkeita, mulla oli yksi "tarpeeton" sarake piilotettuna, eli näkymä on siis 32 saraketta ja 39 riviä.
      Näkymän lisäksi on A- marginaalisarake ja rivi 1 -marginaalirivi, joita ei huomioida tulostukseen.

      - Jos kalenteriani lähdetään laskemaan vuoden alusta, niin tarkasti laskien tuo "B2:AG40" -alue olisi ensimmäiset 4 viikkoa, jotka pitäisi tulostaa. Sen jälkeen tulostetaan seuraavat 4 viikkoa (28 solua), eli alkusolu on edelleen B2 31 saraketta, jolloin viimeisin sarake/rivi olisi BI40, eli edelliset 28 saraketta eivät näkyisi enää.

      ##Jos taas haluat tulostaa aina tietyn kokoisen alueen jostain solusta alkaen..##

      - Juu kyllä, edelleen ajatukseni oli juuri tuo..

      #"joku tyyliin "ActiveCell.Offset(39,30)""
      Tai ei siis noin, koska tuo valitsee vain alueen oikean alanurkan. Ehkä pitää tehdä uusi range:
      Dim rng as Range
      Set rng = ActiveCell.Resize(39,30)
      Tuupata toi rng sitten PrintAreaksi.
      Resizestä: http://www.homeandlearn.org/the_resize_property.html#

      - Tästä en oikein saanut kiinni..

      • väärinpäin

        Resizellä siis vaan suurennetaan valittua aluetta (ennen makroa valittua yhtä solua), ennen kuin siitä tehdään tulostusalue.


      • väärinpäin
        väärinpäin kirjoitti:

        Resizellä siis vaan suurennetaan valittua aluetta (ennen makroa valittua yhtä solua), ennen kuin siitä tehdään tulostusalue.

        Tein koodinpätkän, joka asettaa tulostusalueen taulukon oikean alapuolen ruudun vasemmasta yläkulmasta lukien, kun taulukko on kiinitetty neljäksi ruuduksi. Koodissa olevat muuttujat "rivit" ja "sarakkeet" määrittävät tulostusalueen koon. Jos vasemmalla ja/tai ylhäällä on aina tulostettavia rivejä, niin ne voi ottaa käyttöön sivun asettelujen "Tulosta otsikot"-ikkunan kautta.

        Sub asetatulostusalue()

        Dim rivit As Integer: rivit = 4
        Dim sarakkeet As Integer: sarakkeet = 4

        If ActiveWindow.Panes.Count = 4 Then
        Dim osoite As String
        Dim alue As Range
        osoite = ActiveWindow.Panes(4).VisibleRange.Address
        Set alue = Range(Left(osoite, InStr(osoite, ":") - 1))
        Set alue = alue.Resize(rivit, sarakkeet)
        ActiveWorkbook.ActiveSheet.PageSetup.PrintArea = alue.Address
        End If

        End Sub


    • Kundepuu

      Sub tulosta()
      ActiveSheet.PageSetup.PrintArea = ""
      'Jos kalenteriani lähdetään laskemaan vuoden alusta, niin tarkasti laskien tuo "B2:AG40" -alue olisi ensimmäiset 4 viikkoa, jotka pitäisi tulostaa.
      'Sen jälkeen tulostetaan seuraavat 4 viikkoa (28 solua), eli alkusolu on edelleen B2 31 saraketta, jolloin viimeisin sarake/rivi olisi BI40, eli edelliset 28 saraketta eivät näkyisi enää.

      'eka 4 viikkoa $E$1:$AG$40 Pane 2:ssa
      'seuraavat 4 viikkoa kerroit olevan alkusolu on edelleen B2 31 saraketta, jolloin viimeisin sarake/rivi olisi BI40
      'miksi ei ole sama eka ja toka ja mitern loput?
      'nythän sen pitäisi olla $E$1: $B$I40
      'jos sama niin silloin näin ja aina Pane2 vasen yläkulmasta lähtien
      'korjaa taulukkoasia ja muuta arvot sopiviksi sitten...
      ActiveSheet.PageSetup.PrintArea = ActiveWindow.Panes(2).VisibleRange.Cells(1, 1).Resize(40, 29).Address
      ActiveWindow.SelectedSheets.PrintOut From:=1, To:=1
      End Sub

      Keep EXCELing
      @Kunde

    • Kalenterikalle

      Moi kaikki jeesaajat, Kundea myöten.
      Tilanne on hieman muuttunut, kun sain kaivettua käsiini vanhan viestin, jossa oli Kunden sorvaama koodi tälle kalenterilleni. Vanha kalenterini ei sisältänyt tätä koodia, joten kaivoin sen Excel-sivuston kätköistä. Ja kuinkas kävikään, sain sen toimimaan halutulla tavalla muutamaa lukua muuttamalla.
      Vain aika näytää toimiiko tämä koodi luotettavasti koko vuoden, vai pitääkö jotain kohtaa viilata.

      Kerran vielä Kaikille ja Kundellekin kiitos jeesistä!

      Tässä alla kokonaisuudessaan tuo koodi.

      Sub luo_pdf()
      Dim x As Long
      Dim Sarake As String
      On Error Resume Next
      Application.DisplayAlerts = False
      Worksheets("Lomat2016").Activate
      Range("B3") = Format(Date, "dd.mm.yyyy")
      HaeEkasarake
      ActiveWindow.Panes(2).Activate
      x = ActiveWindow.Panes(2).ScrollColumn
      If x > 26 Then
      Sarake = Chr(Int((x - 1) / 26) 64) & Chr(((x - 1) Mod 26) 65)
      Else
      Sarake = Chr(x 64)
      End If
      Worksheets.Add().Name = "Huuhaa"
      Worksheets("Lomat2016").Range("B2:B40").Copy Worksheets("Huuhaa").Range("A1")
      Worksheets("Lomat2016").Range(Sarake & 2).Resize(39, 28).Copy Worksheets("Huuhaa").Range("B1")
      Worksheets("Huuhaa").Columns(1).AutoFit
      ActiveSheet.ResetAllPageBreaks
      ActiveWindow.View = xlPageBreakPreview
      ActiveSheet.VPageBreaks(1).DragOff Direction:=xlToRight, RegionIndex:=1
      Set ActiveSheet.VPageBreaks(1).Location = Range("AG1")
      ActiveWindow.View = xlNormalView
      With ActiveSheet.PageSetup
      .LeftMargin = Application.InchesToPoints(0.31496062992126)
      .RightMargin = Application.InchesToPoints(0.31496062992126)
      .Orientation = xlLandscape
      .FitToPagesWide = 1
      .FitToPagesTall = 1
      .Zoom = 53
      End With

      Worksheets("Huuhaa").Range("A1:AG40").Select
      Selection.ExportAsFixedFormat Type:=xlTypePDF, Filename:="D:\peedeeäffät\pdfkoe.pdf", _
      Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas _
      :=False, OpenAfterPublish:=True
      Worksheets("Huuhaa").Delete
      Application.DisplayAlerts = True
      End Sub

      Sub HaeEkasarake()
      Päiväys = Date
      If weekDay(Date, vbMonday) = 6 Then
      Haku = Format(Date - 1, "d.m.")
      Päiväys = Päiväys - 1
      Else
      If weekDay(Date, vbMonday) = 7 Then
      Haku = Format(Date - 2, "d.m.")
      Päiväys = Päiväys - 2
      Else
      Haku = Format(Date, "d.m.")
      End If
      End If
      With Range("E4:JD4")
      Set Solu = .Find( _
      What:=Haku, _
      LookIn:=xlValues, _
      LookAt:=xlWhole, _
      SearchOrder:=xlByRows, _
      SearchDirection:=xlNext, _
      MatchCase:=False, _
      SearchFormat:=False)
      If Not Solu Is Nothing Then
      Set Löydetty = Solu
      EkaOsoite = Solu.Address
      Do
      Set Löydetty = Union(Löydetty, Solu)

      Set Solu = .FindNext(Solu)
      Loop While Not Solu Is Nothing And Solu.Address <> EkaOsoite
      End If
      End With
      End Sub

    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Kiitos nainen

      Kuitenkin. Olet sitten ajanmerkkinä. Tuskin enää sinua näen ja huomasitko, että olit siinä viimeisen kerran samassa paik
      Tunteet
      12
      3790
    2. MTV: Kirkossa saarnan pitänyt Jyrki 69 koki yllätyksen - Paljastaa: "Se mikä oli hyvin erikoista..."

      Jyrki Linnankivi alias Jyrki 69 on rokkari ja kirkonmies. Teologiaa opiskeleva Linnankivi piti elämänsä ensimmäisen saar
      Maailman menoa
      78
      1997
    3. Hyväksytkö sinä sen että päättäjämme ei rakenna rauhaa Venäjän kanssa?

      Vielä kun sota ehkäpä voitaisiin välttää rauhanponnisteluilla niin millä verukkeella voidaan sanoa että on hyvä asia kun
      Maailman menoa
      543
      1610
    4. Kirjoita yhdellä sanalla

      Joku meihin liittyvä asia, mitä muut ei tiedä. Sen jälkeen laitan sulle wappiviestin
      Ikävä
      83
      1267
    5. Olet hyvin erilainen

      Herkempi, ajattelevaisempi. Toisaalta taas hyvin varma siitä mitä haluat. Et anna yhtään periksi. Osaat myös ilkeillä ja
      Ikävä
      67
      1077
    6. Yksi syy nainen miksi sinusta pidän

      on se, että tykkään luomusta. Olet luonnollinen, ihana ja kaunis. Ja luonne, no, en ole tavannut vielä sellaista, joka s
      Ikävä
      33
      1018
    7. Hyödyt Suomelle???

      Haluaisin asettaa teille palstalla kirjoittelevat Venäjää puolustelevat ja muut "asiantuntijat" yhden kysymyksen pohditt
      Maailman menoa
      214
      898
    8. Hyvää Joulua mies!

      Toivottavasti kaikki on hyvin siellä. Anteeksi että olen hieman lisännyt taakkaasi ymmärtämättä kunnolla tilannettasi, o
      Ikävä
      60
      873
    9. Hyvää talvipäivänseisausta

      Vuoden lyhyintä päivää. 🌞 Hyvää huomenta. ❄️🎄🌌✨❤️😊
      Ikävä
      171
      854
    10. Paljastavat kuvat Selviytyjät Suomi kulisseista - 1 päivä vs 36 päivää viidakossa - Katso tästä!

      Ohhoh! Yli kuukausi viidakossa voi muuttaa ulkonäköä perusarkeen aika rajusti. Kuka mielestäsi muuttui eniten: Mia Mill
      Suomalaiset julkkikset
      3
      798
    Aihe