Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VBA: Kuvien näkyvyys/ohjaus visual basicilla

Sivun loppuun

migge78 [15.06.2010 15:37:26]

#

Olisi tarkoitus saada Excelissä näkymään jokin tietty kuva tietyn solun tietyllä arvolla. Eli, jos solussa on vaikka numero 2, niin silloin tulee näkyviin kuva Kuva2.jpg.
Excelistä en työkalua löytänyt tallaiseen tapaukseen ja VB:llä yritin kikkailla, mutta taidot ei riitä. Osaisiko joku kertoa "rimpsunpätkän" eli koodin, millä kuvat saisi Exceliin näkymään haluamallani tavalla.

Kiitossh

JussiR [15.06.2010 15:41:23]

#

Kuvan saa tällä koodilla:

ActiveSheet.Pictures.Insert("C:\Documents and Settings\All Users\Documents\My Pictures\Sample Pictures\Blue hills.jpg").Select

Ei kai siinä enää ole mitään ongelmaa?
Jos on niin-> https://www.ohjelmointiputka.net/oppaat/opas.php?tunnus=vbo_4

migge78 [16.06.2010 08:56:45]

#

Kiitos Jussille tuosta neuvosta,
Tuolla saa kuvan haettua, mutta saako tämän tehtyä niin, että minulla on kolme kuvaa joista haluan että vain yksi näkyy kerrallaan tietyllä solun arvolla. Vai pitääkö tehdä tehdä joku käsky, että aikaisemmat ladatut kuvat poistetaan aina ennen uuden tuontia. Muuten kuvia tulee aina vain lisää.
Ja miten saa tehtyä komentoja niin, ettei tarvitse erikseen Buttoneita, vaan niin että kun soluun on syötetty joku arvo niin käsky toteutuu automaattisesti sen mukaan.

JussiR [16.06.2010 09:27:07]

#

Nuo kaikki komennot saa selville kun nauhoitat makron ja menet VBA:lla katsomaan moduulista koodin, jonka makro loi.
----

Tämä komento valitsi excelistäni kuvan (olin lisännyt aiemmin yhden kuvan ja poistanut sen jälkeen, joten tämän kuvan nimi oli Picture 2)

ActiveSheet.Shapes("Picture 2").Select

----
Kuvan poistaminen onnistuu kun valitset kuvan ylläolevalla tavalla ja ajat komennon:

Selection.Delete

----
Tässä koodi joka kertoo mikä teksti on solussa A2

MsgBox Range("A2").Text

----

Saat kuvan muuttumaan käyttäen tuota If-lauseketta, jonka käyttöön linkkasin aiemmin oppaan.
Eli tyyliin

If Range("A1").Text = "1" Then
   'Tähän koodi sille mitä tehdään jos solun A1 teksti on 1
ElseIf Range("A1").Text = "2" Then
   'Tähän koodi sille mitä tehdään jos solun A1 teksti on 2
ElseIf Range("A1").Text = "3" Then
   'Tähän koodi sille mitä tehdään jos solun A1 teksti on 3
End If

Parempiakin tapoja on kuin If-lauseke. Esim select case hommelit, mutta olen huomanut että case on liian vaikea ymmärtää joillekin aloittelijoille... Mutta kannattaa tsekata: https://www.ohjelmointiputka.net/oppaat/opas.php?tunnus=vbo_4#haarautuminen
----
Tapa 2:

Tuo että kuvan nimi muuttuu aina kun lisää uuden kuva, tekee tästä vähän hankalamman ja alkaisin itse jo vääntämään jotain purkkasysteemiä.
Eli jos kuvia ei ole satoja erilaisia, laittaisin ne valmiiksi taulukkoon, mutta "huitsin nevadaan" eli johonkin mistä niitä ei näe. En ainakaan löytänyt mahdollisuutta piilottaa kuvaa muulla tavalla.
Tässä funktio joka siirtää kuvan "huitsin nevadaan".

Function Nevada(Kuvannimi As String)
ActiveSheet.Shapes(Kuvannimi).Select 'Valitaan kuva
    Selection.ShapeRange.IncrementLeft 30005.25 'Jossain kaukana oikeallapäin
    Selection.ShapeRange.IncrementTop 960# 'Jossain kaukana alhaalla päin. Kannattaa ehkä laittaa suurempikin arvo esim. 3000#
End Function

Ja tässä esimerkki funktion käytöstä

Nevada ("Picture 1")

------
Ja tämä koodi siirtää takaisin vasempaan yläkulmaan.. minun käyttämässä kuvassa

Selection.ShapeRange.IncrementLeft -60.75
Selection.ShapeRange.IncrementTop -43.5

Tuokin tapa on vähän kömpelö koska se ottaa nuo left ja Top arvot ilmeisesti kuvan keskikohdasta, joten kuvan pituus ja korkeus vaikuttaa siihen mitä noihin pitää syöttää ja joudut selvittämään nuo koodit nauhoittamalla makron joka kuvalle erikseen (PAITSI jos kaikki kuvat ovat samankokoisia). En löytänyt tapaa selvittää kuvan korkeutta ja pituutta koodin avulla.

Uskon että yksinkertaisin tapa on nyt lisätä kaikki kuvat taulukkoon ja nauhottaa jokaiselle oma makro, jossa siirrät kuvan paikkaan, jossa haluat sen näkyvän silloin kuin pitää. Sitten voit vaan kutsua tätä "komentoa" ajamalla kyseisen makron tuossa If-lausekkeessa, jonka teet. Eli laittamalla yksinkertaisesti makron nimen koodiin, joka on yleensä "MacroX" ja X:n tilalla on numero, joka kertoo monesko sun nauhoittama makro se on. Makrot näkee VBA:lla Modules-kansiosta yleensä Module1:stä.

'Tämä koodi ajaa makron nimeltä Macro1:
Macro1
':D lol

Makroja ei kuitenkaan tarvitse nauhoittaa jokaiselle omaa, jos kuvat ovat samankokosia. Muutat vain kuvan nimen..
-----
Toivottavasti tämä ei alkanut vaikuttaa liian monimutkaiselta.

- Jussi

migge78 [16.06.2010 10:03:49]

#

Ei vaikuttanut liian monimutkaiselta, eiköhän noilla jollain saa kikkailtua kuvat toimimaan, niinkuin pitääkin.

Kiitos suuri!

migge78 [21.06.2010 13:25:42]

#

No nii, ehdin vasta nyt kokeilla tuota kuvan siirto "käskyä", ja en tietystikään saanut sitä toimimaan.

Saan sen kyllä toimimaan Button-napin kautta, mutta ilman en.
Ongelma on se etten tiedä mihin tai millä käskyllä VBA:han se pitäisi laittaa.
Yritin väsätä tuota Sheet2(Sheet2)-sivulle, jos tämä on oikea paikka, niin mikä käsky sivun alkuun tulee laittaa, että Exceli "lukee" nämä käskyt kun solun arvoa muuttaa????

JussiR [21.06.2010 13:33:19]

#

Itse en löytänyt excelistä mitään valmista keinoa huomata solun arvon muutos. Olisiko mahdollista, että laittaisit sinne vaan napin, jota täytyy painaa aina kun arvoa muuttaa? :S

migge78 [21.06.2010 15:06:58]

#

Nyt löysin keinon siirtää ilman nappia:

Private Sub Worksheet_Change(ByVal Target As Range)
kuvansiirto
End Sub

Kiitos neuvoista.

...tosin tajusin että tuo siirtää jokaisella käskyllä kuvaa. hmmm...

JussiR [28.06.2010 09:14:05]

#

Laita jokin Timeri tarkistamaan tietyin väliajoin onko arvo muuttunut. Vähän tyhmä tapa, mutta ei taida olla muitakaan.

groovyb [28.06.2010 12:28:32]

#

tai sitten käyttää siihen tarkoitettua eventtiä...

http://en.kioskea.net/faq/1117-vba-detecting-changes-in-cell


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta