Elikkäs, ohjelmoin Excelin mukana tulevalla Visual Basic editorilla.
1) Onko Excelin mukana tuleva Visual Basic täysimittainen versio Visual Basicista, vaiko joku typistetty versio?
Minulla on Visual Basicissa formi (UserForm1 nimeltään), jossa on kolme Command Buttonia (CommandButton1, CommandButton2 ja CommandButton3).
Tässä niiden koodi:
Private Sub CommandButton1_Click() Freeze(CommandButton2) End Sub Private Sub CommandButton2_Click() MessageBox("Test") End Sub Private Sub CommandButton3_Click() MakeTable("Test",2,2) End Sub
Tässä funktiokoodi
Function Freeze(Handle as string) With Handle .Enabled = False End With End Function Function MessageBox(Word as String) MsgBox Word End Function Function MakeTable(Name as string, x as integer, y as integer) Public Name() ReDim Name(1 to x, 1 to y) End Function
CommandButton1. Tätä painaessa olisi tarkoitus, että CommandButton2 menee toimintakyvyttömäksi. Ja miksi se pitäisi toteuttaa funktiona? Siksi, koska tälläisiä buttoneita, jotka pitäisi helposti saada pois pelistä tulee olemaan kymmeniä. Tälläistä erroria heittää:
Compile error: With object must be user-defined type, Object, or Variant
2) Miten saan korjattu tämän ongelman?
CommandButton2. Kaikki toimii miten pitääkin (Tulee msgbox, jossa lukee "Test")
CommandButton3. Tarkoituksena olisi luoda taulukko. Ohjelmassa on n (tuntematon) määrä taulukoita, joissa tulee olemaan n määrä soluja, joten taulukoita pitäisi pystyä luomaan helposti, ilman, että niitä pitää luoda käsin koodin sisältä. CommandButton3:sta tulee tälläinen error:
Compile error:
Syntax error
3) Miten voisin korjata ongelman tai luoda taulukoita mahdollisimman helposti?
4) Miten voin tehdä Windows tyylisen file-pickerin?commdlg.dll sisältää kyllä ohjausobjektin tälläisen tekemiseen helposti, mutta en saa importattua commdlg.dll:ää millään tavalla Visual Basiciin. commdlg32.dll:n Visual Basic suostuu kyllä ottaamaan, mutta tuo taas herjaa "No valid lisenced" tai vastaavaa.
Kiitos jo etukäteen vastauksista! Olen miettinyt näitä monta tuntia, mutta en enää yksinkertaisesti keksi vastauksia kysymyksiini. Kaikkiin kysymyksiinhän ei tarvitse vastata, jos edes yhden saisin ratkaistua, olisin kiitollinen!
Excelin mukana ei tule kunnollista VB:tä, vaan pelkkä VBA (Visual Basic for Applications), mutta voi silläkin tehdä yhtä ja toista.
Viittaus nappiin pitää välittää näin, jotta ohjelma toimii:
Sub Himmenna(nappi As CommandButton) nappi.Enabled = False End Sub Private Sub CommandButton1_Click() Himmenna CommandButton1 End Sub
Kaikki taulukot voi tallentaa yhteen isoon taulukkoon tähän tapaan:
Dim tiedot(1 To 5, 1 To 1000) As Integer
Nyt käytössä on viisi taulukkoa, joissa jokaisessa on 1000 alkiota. Taulukolle ei voi antaa nimeä muuttujan sisällön perusteella. Komento Public toimii vain kooditiedoston alussa aliohjelmien ulkopuolella.
Tiedostoikkunaa voi kutsua suoraan WinAPIn kautta, mikä toimii mainiosti myös VBA:ssa:
https://www.ohjelmointiputka.net/koodivinkit/
Kiitos! Toimii kuin rasvattu! :)
Minulla on nyt valmiina systeemi, jonka kanssa saan selville tietyn hakemiston kaikki tiedostot. Kuitenkin eri hakemistojen eri tiedostot pitäisi saada selville monta kertaa eri paikoissa koodia.
Helpointa olisi varmaankin luoda funktio tuosta hakemiston tiedostolistaajasta. Mutta, 5) kuinka funktiolla voi palauttaa vaikkapa kymmenen eri tiedoston nimen?
Yhden funktion sisällä on myös tälläinen käsky "ListBox1.AddItem Name". Tuo ei kuitenkaan toimi. 6) Miten pääsee funktion sisältä ListBoxiin käsiksi? Pitäisikö ListBox jotenkin määritellä Publiciksi, jotta siihen ja sen ominaisuuksiin pääsisi käsiksi minkä tahansa proseduurin sisältä?
Kiitos paljon avusta! :)
Queq kirjoitti:
kuinka funktiolla voi palauttaa vaikkapa kymmenen eri tiedoston nimen?
Function Palle As String() Dim MJonot(10) As String Palle = MJonot End Function
Queq kirjoitti:
Pitäisikö ListBox jotenkin määritellä Publiciksi, jotta siihen ja sen ominaisuuksiin pääsisi käsiksi minkä tahansa proseduurin sisältä?
Koitas Forminnimi.ListBox1.AddItem
Kiitos! Nyt toimii! 7) Onko muuten Visual Basicissa mitään valmista funktiota, millä saisi selville kuinka iso taulukko on kooltaan? Kyllähän sitä voisi aina muuttujan kautta pitää huolta taulukon koosta, mutta valmis funktio helpottaisi kyllä ihan mukavasti. :)
Count-funktio taisi olla. Ellei, niin LBound kertoo alimman solun ja UBound isoimman, niistä erotuksella.
8) Miten variant tai string tyyppisen muuttujan saa muutettua currency-tyypiseksi?
CCur on kyllä se funktio, mutta ei ainakaan itselläni toimi. Tulee vain: Run-time error '13': Type mismatch.
Tässä vähän koodia:
' fso-hässäkkää Number = File1.ReadLine ' <- epäilen, että tuo ReadLine palauttaa jossain sopimattomassa muodossa dataa. MsgBox CCur(Number)
Ja Number on kyllä mielestäni Currencyn rajoissa, eli ongelma ei siitä pitäisi tulla. Mutta kuitenkin tuo herjaa. :/
Sain tuon currencyn toimimaan. Nyt tuli seuraava ongelma eteen, johon en saanut vastausta monen tunnin puurtamisen jälkeenkään.
Eli, tässä vähän koodia:
Sub Draw() ' Draw the chart once Macro1 End Sub Sub DrawAll() ' Draw the chart 20 times For i = 1 To 20 Macro1 Next i End Sub Sub Macro1() ' Range("A1:B10").Select Charts.Add ActiveChart.ChartType = xlLineMarkers ActiveChart.SetSourceData Source:=Sheets("Sheet1").Range("A1:B10"), PlotBy _ :=xlColumns ActiveChart.Location Where:=xlLocationAsObject, Name:="Sheet1" With ActiveChart .HasTitle = False .Axes(xlCategory, xlPrimary).HasTitle = False .Axes(xlValue, xlPrimary).HasTitle = False End With ActiveWindow.Visible = False End Sub
Draw():lla tulee tälläistä jälkeä http://koti.mbnet.fi/php-m/muuta/problem/1.png Kaikki toimii kuten pitääkin.
Mutta DrawAll():lla tulee tälläistä jälkeä: http://koti.mbnet.fi/php-m/muuta/problem/2.png Eli, kaikki 20 kuvaajaa on päällekäin.
Tässä on siis se pulma. Pitäisi saada kaikki kuvaajat menemään omalle sivulleen automaattisesti siten, ettei ne ole päällekäin, tähän tyyliin: http://koti.mbnet.fi/php-m/muuta/problem/3.png
9) Kuinka saan 20 kuvaajaa (charttia) automaattisesi järjestäytymään kuvan 3.png mukaisesti?
Ja asiaa vielä hieman sivuten:
10) Kuinka saan selville onko "chart"-niminen WorkSheet olemassa; tulee error, jos yrittää luoda Chart-nimistä worksheettiä ja se on jo olemassa. Yksi mahdollisuus olisi On error GoTo MakeNewSheet, mutta tämä ei ole mielestäni se paras vaihtoehto; vai onko tämä sitten ainoa vaihtoehto?
Kiitoksia avusta paljon! Itse en vaan keksi ratkaisua noihin pulmiin. :/
9) Chartin paikka
Chartin asema määritetään Parentin kautta. Seuraava koodi lisää uuden Chartin alimmaiseksi, mutta siitä saa idean, mitä pitää tehdä.
Dim toppi As Single Dim lefti As Single If ActiveSheet.ChartObjects.Count > 1 Then With ActiveSheet.ChartObjects(ActiveSheet.ChartObjects.Count - 1) lefti = .Left toppi = .Top + .Height End With Else lefti = 100 toppi = 25 End If ActiveChart.Parent.Left = lefti ActiveChart.Parent.Top = toppi
10) Tarkistetaan löytyykö Sheet
Dim sh As Worksheet For Each sh In ActiveWorkbook.Sheets If sh.Name = "Chart" Then MsgBox "Chart löytyy": Exit For Next sh If Not sh Is Nothing Then Set sh = Nothing
Kiitos BadSource! Tuo 10. ei kyllä toimi aivan täydellisesti, ilmeisesti teen jotain väärin (muutin tuon funktioksi). Mutta kiitos avustuksesta, nyt tiedän miten taas edetä. :)
Vielä ainakin yksi kysymys 11) Kuinka teen folder-pickerin?
Tällä hetkellä file-picker ( https://www.ohjelmointiputka.net/koodivinkit/
Kymppi olikin vain esimerkki, millä sait selville sivujen nimet. Siitä soveltaen sun tarpeisiin sopiva.
11) FolderBrowser
Tuosta on putkassa VB-esimerkki, jonka saa siirrettyä sellaisenaan VBA:n puolelle. Eli FolderBrowser.
Tattista vaan! Alkaa näyttää jo aika täydelliseltä tämä projektini, kiitos kuuluu myös teille kaikille neuvojille. :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.