moi kaikille taasen...
Private Sub Command1_Click()
Dim xlApp As Excel.Application
Dim wb As Workbook
Dim ws As Worksheet
Dim var As Variant
var = "Toimiiko?"
Set xlApp = New Excel.Application
Set wb = xlApp.Workbooks.Open("C:\Program Files\APV\apvprogramm.xlsm")
Set ws = wb.Worksheets("Data") 'Specify your worksheet name
ws.Range("B2").Value = var
'or
' var = ws.Cells(1, 1).Value
wb.Close
xlApp.Quit
Set ws = Nothing
Set wb = Nothing
Set xlApp = Nothing
End Submikäköhän tossa vois olla vikana kun vaikuttaa että excel jää päälle kun painaa tuota nappia. kirjoittaa kyllä tuon tekstin excel taulukkoon mutta ei sammuta sitä. koska jää jumiin koko ohjelma.
dii nyt se sammuu jo =)
eli kun tuo ohjelma sammuttaa excelin "wb.close true"
tulee niin aukee semmonen "Tallennus ikkuna" tuohon näytölle.
millä saan tämän ikkunan hävitettyä ja tallennettua tiedon?
alla koodi
Private Sub Command1_Click()
Dim xlApp As excel.Application
Dim Wb As Workbook
Dim Ws As Worksheet
Dim var As Variant
var = "Toimiiko se?"
Set xlApp = New excel.Application
Set Wb = xlApp.Workbooks.Open("C:\Program Files\APV\APVprogramm.xlsm")
xlApp.DisplayAlerts = False
Set Ws = Wb.Worksheets("Data") 'Specify your worksheet name
Ws.Range("B4").Value = var
On Error Resume Next
Wb.Close True
xlApp.Quit
Set Ws = Nothing
Set Wb = Nothing
Set xlApp = Nothing
End Sub1) Siirrä tiedosto pois Program Filesin alta! Windows 7 ja Vista eivät anna oletuksena tallentaa sinne. Oletan että APV on joku oma juttusi?
2) Voit varmistaa, ettei kyselyikkunaa tule määrittämällä tiedostonimen: Wb.Filename = "C:\Users\Käyttäjä\Documents\oma.xlsm"
Tiedoston täytyy olla hakemistossa, johon on kirjoitusoikeudet!
3) Jos haluat tehdä sulkurivistä helpommin luettavan, niin voit kirjoittaa sen muodossa Wb.Close SaveChanges:= True
4) Poista On Error Resume Next - et tee sillä mitään tässä kohtaa. Lisää mieluummin On Error Goto -pohjainen virheenhallinta.
Jos teet ohjelmaa vain omaan käyttöön, niin et tarvitse kovin kummoista virheenhallintaa. Jos ohjelma tulee muiden käyttöön, niin sitten virheenhallinta ja lokitoiminnot muotoutuvat ensiarvoisen tärkeiksi, jotta saat tarvittavat tiedot ja että voit selvittää ongelmia, vaikkei virhe toistuisi omassa testiympäristössäsi.
juu huomasin jo ton ettei program files valikkoon voi ihan helpolla tallentaa, nyt toimii sitä myöten, kun vaihdoin kansioo =)
Kiitos ohje linkistä.
kuinkas vaikeaa olisi saada "tallennus lupa" tuonne program files kansioon??
Parempi kysymys olisi "kuinka selvitän hakemiston johon voin tallentaa?"
' modFolder.bas Option Explicit Public Enum FolderEnum feCDBurnArea = 59 ' \Docs & Settings\User\Local Settings\Application Data\Microsoft\CD Burning feCommonAppData = 35 ' \Docs & Settings\All Users\Application Data feCommonAdminTools = 47 ' \Docs & Settings\All Users\Start Menu\Programs\Administrative Tools feCommonDesktop = 25 ' \Docs & Settings\All Users\Desktop feCommonDocs = 46 ' \Docs & Settings\All Users\Documents feCommonPics = 54 ' \Docs & Settings\All Users\Documents\Pictures feCommonMusic = 53 ' \Docs & Settings\All Users\Documents\Music feCommonStartMenu = 22 ' \Docs & Settings\All Users\Start Menu feCommonStartMenuPrograms = 23 ' \Docs & Settings\All Users\Start Menu\Programs feCommonTemplates = 45 ' \Docs & Settings\All Users\Templates feCommonVideos = 55 ' \Docs & Settings\All Users\Documents\My Videos feLocalAppData = 28 ' \Docs & Settings\User\Local Settings\Application Data feLocalCDBurning = 59 ' \Docs & Settings\User\Local Settings\Application Data\Microsoft\CD Burning feLocalHistory = 34 ' \Docs & Settings\User\Local Settings\History feLocalTempInternetFiles = 32 ' \Docs & Settings\User\Local Settings\Temporary Internet Files feProgramFiles = 38 ' \Program Files feProgramFilesCommon = 43 ' \Program Files\Common Files 'feRecycleBin = 10 ' ??? feUser = 40 ' \Docs & Settings\User feUserAdminTools = 48 ' \Docs & Settings\User\Start Menu\Programs\Administrative Tools feUserAppData = 26 ' \Docs & Settings\User\Application Data feUserCache = 32 ' \Docs & Settings\User\Local Settings\Temporary Internet Files feUserCookies = 33 ' \Docs & Settings\User\Cookies feUserDesktop = 16 ' \Docs & Settings\User\Desktop feUserDocs = 5 ' \Docs & Settings\User\My Documents feUserFavorites = 6 ' \Docs & Settings\User\Favorites feUserMusic = 13 ' \Docs & Settings\User\My Documents\My Music feUserNetHood = 19 ' \Docs & Settings\User\NetHood feUserPics = 39 ' \Docs & Settings\User\My Documents\My Pictures feUserPrintHood = 27 ' \Docs & Settings\User\PrintHood feUserRecent = 8 ' \Docs & Settings\User\Recent feUserSendTo = 9 ' \Docs & Settings\User\SendTo feUserStartMenu = 11 ' \Docs & Settings\User\Start Menu feUserStartMenuPrograms = 2 ' \Docs & Settings\User\Start Menu\Programs feUserStartup = 7 ' \Docs & Settings\User\Start Menu\Programs\Startup feUserTemplates = 21 ' \Docs & Settings\User\Templates feUserVideos = 14 ' \Docs & Settings\User\My Documents\My Videos feWindows = 36 ' \Windows feWindowFonts = 20 ' \Windows\Fonts feWindowsResources = 56 ' \Windows\Resources feWindowsSystem = 37 ' \Windows\System32 End Enum Private Declare Function SHGetFolderPathW Lib "shfolder" (ByVal hwndOwner As Long, ByVal nFolder As Long, ByVal hToken As Long, ByVal dwFlags As Long, ByVal pszPath As Long) As Long Public Function SpecialFolder(pfe As FolderEnum) As String Const MAX_PATH = 260 Static bytBuffer(0 To MAX_PATH + 1) Dim strBuffer As String strBuffer = bytBuffer If SHGetFolderPathW(0, pfe, 0, 0, StrPtr(strBuffer)) = 0 Then SpecialFolder = Left$(strBuffer, InStr(strBuffer, vbNullChar) - 1) If Right$(SpecialFolder, 1) = "\" Then SpecialFolder = Left$(SpecialFolder, Len(SpecialFolder) - 1) End Function
Jos tiedosto on jaossa kaikille käyttäjille:
strHakemisto = SpecialFolder(feCommonAppData) & "\APV"
Jos tiedosto on jaossa vain nykyiselle käyttäjälle:
strHakemisto = SpecialFolder(feUserAppData) & "\APV"
Jos tiedosto on jaossa vain nykyiselle käyttäjälle, mutta tiedosto on konekohtainen eli se ei saa jakautua verkon ylitse Windows-palvelimelle:
strHakemisto = SpecialFolder(feLocalAppData) & "\APV"
Nämä asiat on olleet Microsoftin dokumentaatiossa ja suosituksissa jostain NT4-ajoista asti, mutta vasta Vistasta asti on myös laitettu oletusoikeudet tiukoiksi, jotta ohjelmoijat alkaisivat vihdoinkin noudattaa näitä (erittäin!) hyviä tapoja. Kirjoittamisen salliminen Program Filesiin on tietoturvan vinkkelistä erittäin riskialtista.
Näiden lisäksi Vistasta eteenpäin löytyy Virtual Store, jonne Program Filesistä avatut tiedostot kopioituvat (ja mahdollisesti tallentuvat). Tämä tarjoaa taaksepäinyhteensopivuutta. Parasta on kuitenkin tallentaa tiedostot sinne minne ne kuuluukin tallentaa.
kuinka saan kaivettua kuinka monta "stringia" tai mitenkä se sanotaan montako osaa split funktiolla tehdyllä Array:ssa on??
elikkä jos stringi on "235r,234,,,1,23,"
niin monta ko osaa split tuosta tekee jos osat erotetaan ","
olihan tarpeeks vaikeesti selitetty?7
ubound(taulukko)
Kiitos juuri tätä tarkoitin!!
onkohan jossain olemassa "opusta" jossa luetellaan ja kerrotaan tälläisistä "fuktioista" vai mitä nämä nyt on...
Excelin VBA helpin "function reference" tai "Visual Basic for Applications Language Reference". Löytyy luultavasti kun koodi-ikkunassa painat F1
mulla ei "jostain" syystä tuo msdn kokoelma toimi tässä vb:ssä...
eiku niin opetellaanpas lukemaan Excel... siellähän se toimii....
Moi taas kaikille!
VB6:llä on mahdollista käsitellä Office/Excel tiedostoja myös ilman, että Office tai Excel on asennettu järjestelmään edellyttäen, että 2007 Office System Driver: Data Connectivity Components tai Microsoft Access Database Engine 2010 Redistributable on asennettu järjestelmään.
(Access/Excel 2000 - 2003 edellyttää vain Jet 4.0 Service Pack 8.0 asennuksen)
Porjektiin (ExcelADO.vbp): 'Referenssit 'Microsoft ActiveX Data Object 2.8 Library (msdao 15.dll) 'Microsoft ADO Ext. 2.8 for DLL and Security (msADOX.dll)
Lomake (Form1)
'BorderStyle 1 - FixedSingle
' StartUpPosition 2 - CenterScreen
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim row As Integer
Dim col As Integer
Dim ColLetter() As String
'Ohjausobjektit:
'1 MSFlexGrid (MSFlexGrid1)
'asetukset:
'Rows 2, Cols 2
'Fixed Rows 1, Fixed Cols 1
'ScrollBars 3 - Both
'FocusRect 2 - Heavy
'HighLight 1 -Always
'MousePointer 0 - Default
'FillStyle 0 - Single
'SelectionMode 0 - Free
'AllowUserResizing 3 - Both
'1 komentopainike (Command1)
'1 Label (Label1)
Private Sub Form_Load()
Dim i As Integer
If Dir("C:\xlsamples\xlsample1.xls") = "" Then
Dim cat As adox.Catalog
Dim tbl As adox.Table
Dim col As adox.Column
Set cat = New adox.Catalog
Dim colNames() As String
colNames = Split(",ID,Pvm,Data", ",") 'esim.
'Excel 2000 - 2003 tiedostot
'cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
'"Data Source=C:\xlsamples\xlsample1.xls;Extended Properties=Excel 8.0"
'Excel 2007 - 2010 tiedostot
cat.ActiveConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=C:\xlsamples\xlsample1.xls;Extended Properties=Excel 12.0"
For i = 1 To 3
Set tbl = New adox.Table
tbl.Name = "Taul" & CStr(i)
For j = 1 To 3
Set col = New adox.Column
With col
.Name = colNames(j)
.Type = adVarWChar
End With
tbl.Columns.Append col
Set col = Nothing
Next j
cat.Tables.Append tbl
Set tbl = Nothing
Next i
Set cat = Nothing
Erase collNames
End If
Dim sql As String
Dim connstr As String
connstr = _
"Provider=Microsoft.ACE.OLEDB.12.0;" + _
"Data Source=C:\xlsamples\xlsample1.xls;" + _
"Extended Properties=""Excel 12.0 Xml;HDR=No"""
sql = "SELECT * FROM [Taul1$];"
Set conn = New ADODB.Connection
conn.Mode = adModeShareExclusive
conn.ConnectionString = connstr
conn.Open
Set rs = New ADODB.Recordset
rs.Open sql, conn, adOpenDynamic, adLockOptimistic, 1
MSFlexGrid1.Cols = rs.Fields.Count + 1
Dim rw As Integer: rw = 1
MSFlexGrid1.ColWidth(0) = 500
ReDim ColLetter(25) As String
For i = 65 To 90
ColLetter(i - 65) = Chr(i)
Next i
MSFlexGrid1.ColAlignment(0) = flexAlignCenterCenter
For i = 1 To MSFlexGrid1.Cols - 1
MSFlexGrid1.TextMatrix(0, i) = ColLetter(i - 1)
MSFlexGrid1.FixedAlignment(i) = flexAlignCenterCenter
Next i
rs.MoveFirst
Do While Not rs.EOF
rw = rw + 1
MSFlexGrid1.Rows = rw
On Error Resume Next
MSFlexGrid1.TextMatrix(rw - 1, 0) = rw - 1
For i = 1 To MSFlexGrid1.Cols
MSFlexGrid1.TextMatrix(rw - 1, i) = rs.Fields(i - 1).Value
Next i
rs.MoveNext
Loop
Command1.Caption = "Lisää uusi rivi"
MSFlexGrid1.row = 0
End Sub
Private Sub Form_Unload(Cancel As Integer)
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
End Sub
Private Sub MSFlexGrid1_Click()
If row = 0 Or col = 0 Then
Exit Sub
End If
Static tagValue As String
tagValue = MSFlexGrid1.TextMatrix(row, col)
Dialog.Caption = "Muuta solun (" & ColLetter(col - 1) & CStr(row) & ") arvoa"
Dialog.Text1.Text = tagValue
Dialog.Show 1
If dialogresult <> "__CANCEL" And dialogresult <> tagValue Then
MSFlexGrid1.TextMatrix(row, col) = dialogresult
rs.MoveFirst
For i = 0 To row - 2
rs.MoveNext
Next i
rs.Fields(col - 1).Value = dialogresult
rs.Update
End If
End Sub
Private Sub MSFlexGrid1_EnterCell()
row = MSFlexGrid1.row
col = MSFlexGrid1.col
End Sub
Private Sub Command1_Click()
Dim i As Integer
rs.AddNew
For i = 0 To rs.Fields.Count - 1
rs.Fields(i) = ""
Next
rs.Update
rs.MoveFirst
Dim rw As Integer: rw = 1
Do While Not rs.EOF
rw = rw + 1
MSFlexGrid1.Rows = rw
On Error Resume Next
MSFlexGrid1.TextMatrix(rw - 1, 0) = rw - 1
For i = 1 To MSFlexGrid1.Cols
MSFlexGrid1.TextMatrix(rw - 1, i) = rs.Fields(i - 1).Value
Next i
rs.MoveNext
Loop
Label1.Caption = "Klikaa hiirellä solua jonka arvoa haluat muuttaa"
End Sub
Private Sub MSFlexGrid1_LostFocus()
Label1.Caption = ""
End Sub'Lomake (Dialog)
'BorderStyle 3 - FixedDialog
'ClipControls False
'ControlBox False
'StartUpPositon 2 - CenterScreen
'Ohjausobjektit:
'1 tekstiruutu (Text1)
'2 komentopainiketta (OKButton & CancelButton)
Option Explicit
Private Sub Form_Load()
Text1.Text = ""
End Sub
Private Sub CancelButton_Click()
dialogresult = "__CANCEL"
Unload Me
End Sub
Private Sub OKButton_Click()
dialogresult = Text1.Text
Unload Me
End Sub'Globaali moduuli (Module1) Global dialogresult As String
(oikea nimi)
Moi taas kaikille!
VB6:llä on mahdollista käsitellä Office/Excel tiedostoja myös ilman, että Office tai Excel on asennettu järjestelmään edellyttäen, että 2007 Office System Driver: Data Connectivity Components tai Microsoft Access Database Engine 2010 Redistributable on asennettu järjestelmään.
(Access/Excel 2000 - 2003 edellyttää vain Jet 4.0 Service Pack 8.0 asennuksen)
Porjektiin (ExcelADO.vbp): Referenssit Microsoft ActiveX Data Object 2.8 Library (msdao 15.dll) Microsoft ADO Ext. 2.8 for DLL and Security (msADOX.dll)
Lomake (Form1)
'BorderStyle 1 - FixedSingle
' StartUpPosition 2 - CenterScreen
'Ohjausobjektit:
'1 MSFlexGrid (MSFlexGrid1)
'asetukset:
'Rows 2, Cols 2
'Fixed Rows 1, Fixed Cols 1
'ScrollBars 3 - Both
'FocusRect 2 - Heavy
'HighLight 1 -Always
'MousePointer 0 - Default
'FillStyle 0 - Single
'SelectionMode 0 - Free
'AllowUserResizing 3 - Both
'2 komentopainiketta (Command1 & Command2)
'1 Label (Label1)
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim row As Integer
Dim col As Integer
Dim sql As String
Dim cat As adox.Catalog
Dim tbl As adox.Table
Dim xcol As adox.Column
Dim ColLetter() As String
Private Sub Form_Load()
Dim i As Integer
If Dir("C:\xlsamples\xlsample1.xls") = "" Then
Set cat = New adox.Catalog
Dim colNames() As String
colNames = Split(",ID,Pvm,Data", ",") 'esim.
'Excel 2000 - 2003 tiedostot
'cat.ActiveConnection = _
'"Provider=Microsoft.Jet.OLEDB.4.0;" & _
'"Data Source=C:\xlsamples\xlsample1.xls;" & _
'"Extended Properties=Excel 8.0"
'Excel 2007 - 2010 tiedostot
cat.ActiveConnection = _
"Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=C:\xlsamples\xlsample1.xls;" + _
"Extended Properties=Excel 12.0"
Set tbl = New adox.Table
tbl.Name = "Taul1"
For i = 1 To 3
Set xcol = New adox.Column
With xcol
.Name = colNames(i)
.Type = adVarWChar
End With
tbl.Columns.Append xcol
Set xcol = Nothing
Next i
cat.Tables.Append tbl
Set tbl = Nothing
Set cat = Nothing
Erase colNames
End If
Dim connstr As String
connstr = "Provider=Microsoft.ACE.OLEDB.12.0;" + _
"Data Source=C:\xlsamples\xlsample1.xls;" + _
"Extended Properties=""Excel 12.0;HDR=No;"""
'Excel 2000 - 2003 tiedostot
'"Provider=Microsoft.Jet.OLEDB.4.0;" & _
'"Data Source=C:\xlsamples\xlsample1.xls;" & _
'"Extended Properties=Excel 8.0;HDR=No;"""
sql = "SELECT * FROM [Taul1$];"
Set conn = New ADODB.Connection
conn.Mode = adModeShareExclusive
conn.ConnectionString = connstr
conn.Open
Set rs = New ADODB.Recordset
rs.Open sql, conn, adOpenDynamic, adLockOptimistic, 1
MSFlexGrid1.Cols = rs.Fields.Count + 1
Dim rw As Integer: rw = 1
MSFlexGrid1.ColWidth(0) = 500
ReDim ColLetter(25) As String
For i = 65 To 90
ColLetter(i - 65) = Chr(i)
Next i
MSFlexGrid1.ColAlignment(0) = flexAlignCenterCenter
For i = 1 To MSFlexGrid1.Cols - 1
MSFlexGrid1.TextMatrix(0, i) = ColLetter(i - 1)
MSFlexGrid1.FixedAlignment(i) = flexAlignCenterCenter
Next i
RsAction
Command1.Caption = "Lisää uusi rivi"
Command2.Caption = "Poista rivi"
Command2.Visible = False
MSFlexGrid1.row = 0
End Sub
Private Sub Form_Unload(Cancel As Integer)
On Error Resume Next
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
End Sub
Private Sub MSFlexGrid1_Click()
If MSFlexGrid1.MouseCol = 0 _
And MSFlexGrid1.MouseRow > 1 Then
Command2.Visible = True
Else
Command2.Visible = False
End If
Label1.Caption = ""
End Sub
Private Sub MSFlexGrid1_DblClick()
If row = 0 Or col = 0 Or _
MSFlexGrid1.MouseCol = 0 Or _
MSFlexGrid1.MouseRow = 0 Then
Exit Sub
End If
Static tagValue As String
tagValue = MSFlexGrid1.TextMatrix(row, col)
Dialog.Caption = "Muuta solun (" & _
ColLetter(col - 1) & CStr(row) & ") arvoa"
Dialog.Text1.Text = tagValue
Dialog.Show 1
If dlgResult <> "__CANCEL" And dlgResult <> tagValue Then
MSFlexGrid1.TextMatrix(row, col) = dlgResult
rs.MoveFirst
For i = 0 To row - 2
rs.MoveNext
Next i
rs.Fields(col - 1).Value = dlgResult
rs.Update
End If
End Sub
Private Sub MSFlexGrid1_EnterCell()
row = MSFlexGrid1.row
col = MSFlexGrid1.col
End Sub
Private Sub Command1_Click()
Dim i As Integer
rs.AddNew
For i = 0 To rs.Fields.Count - 1
rs.Fields(i) = ""
Next
rs.Update
RsAction
Label1.Caption = "Kaksoisnapauta hiirellä solua jonka arvoa haluat muuttaa"
End Sub
Private Sub Command2_Click()
Dim i As Integer
Dim colNames() As String
colNames = Split(",ID,Pvm,Data", ",") 'esim.
rs.Close: Set rs = Nothing
conn.Close: Set conn = Nothing
Kill "c:\xlsamples\xlsample1.xls"
Set cat = New adox.Catalog
cat.ActiveConnection = _
"Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=C:\xlsamples\xlsample1.xls;" & _
"Extended Properties=Excel 12.0"
Set tbl = New adox.Table
tbl.Name = "Taul1"
For i = 1 To 3
Set xcol = New adox.Column
With xcol
.Name = colNames(i)
.Type = adVarWChar
End With
tbl.Columns.Append xcol
Set xcol = Nothing
Next i
cat.Tables.Append tbl
Set tbl = Nothing
Set cat = Nothing
MSFlexGrid1.RemoveItem (row)
Dim connstr As String
connstr = "Provider=Microsoft.ACE.OLEDB.12.0;" + _
"Data Source=C:\xlsamples\xlsample1.xls;" + _
"Extended Properties=""Excel 12.0;HDR=no;"""
Set conn = New ADODB.Connection
conn.Mode = adModeShareExclusive
conn.Open connstr
Set rs = New ADODB.Recordset
rs.Open sql, conn, adOpenDynamic, adLockOptimistic, 1
For i = 2 To MSFlexGrid1.Rows - 1
rs.AddNew
For j = 1 To MSFlexGrid1.Cols - 1
rs.Fields(j - 1).Value = MSFlexGrid1.TextMatrix(i, j)
Next
rs.Update
Next
MSFlexGrid1.Clear
RsAction
End Sub
Private Sub MSFlexGrid1_LostFocus()
Label1.Caption = ""
End Sub
Sub RsAction()
rs.MoveFirst
Dim rw As Integer: rw = 1
Do While Not rs.EOF
rw = rw + 1
MSFlexGrid1.Rows = rw
On Error Resume Next
MSFlexGrid1.TextMatrix(rw - 1, 0) = rw - 1
For i = 1 To MSFlexGrid1.Cols
MSFlexGrid1.TextMatrix(rw - 1, i) = rs.Fields(i - 1).Value
Next i
rs.MoveNext
Loop
End Sub'Lomake (Dialog)
'BorderStyle 3 - FixedDialog
'ClipControls False
'ControlBox False
'StartUpPositon 2 - CenterScreen
'Ohjausobjektit:
'1 tekstiruutu (Text1)
'2 komentopainiketta (OKButton & CancelButton)
Option Explicit
Private Sub Form_Load()
Text1.Text = ""
End Sub
Private Sub CancelButton_Click()
dlgResult = "__CANCEL"
Unload Me
End Sub
Private Sub OKButton_Click()
dlgResult = Text1.Text
Unload Me
End Sub'Globaali moduuli (Module1) Global dlgResult As String
89
nyhhän se pommin puotti...
hmm. taasen on puu vastassa...
Dim a As Variant
Dim b As Integer
Dim GpsLong As Currency
Dim GpsLati As Currency
Dim GpsSat As Integer
Private Sub GPSDataFind()
Dim i As Integer, m As Integer
Dim StrLati As String, ModStrLati As String * 8
Dim StrLong As String, ModStrLong As String * 8
If b < 1 Then 'tarkastaa GPS;ltä tulevan datan
Label4.Caption = "Ei yhteyttä GPS palikkaan"
Exit Sub
Else
Label4.Caption = "Yhteys GPS palikkaan olemassa "
End If
For i = 0 To b
If a(i) = "$GPGGA" Then 'etsii datasta oikeaa tietoa
If a(i + 2) <> "" Then
StrLati = a(i + 2)
StrLong = a(i + 4)
For m = 0 To 3
ModStrLati(m) = StrLati(m) 'yrittää erottaa datasta 4 viimeistä merkkiä ja siirtää toiseen stringiin
ModStrLong(m) = StrLong(m)
Next m
For m = 4 To 7
ModStrLati(m) = StrLati(m + 1) 'tällä piti saada piste pois stringistä.
ModStrLong(m) = StrLong(m + 1)
Next m
Label3.Caption = ModStrLati & " " & ModStrLong
Else
Label3.Caption = " ei yhteyttä sateliittiin"
End If
End If
Next i
End Sub
Private Sub Command1_Click()
MSComm1.PortOpen = True
Timer1.Enabled = True
End Sub
Private Sub Command2_Click()
Timer1.Enabled = False
MSComm1.PortOpen = False
End Sub
Private Sub Text1_Change()
End Sub
Private Sub Timer1_Timer()
Dim PlaceD As String
PlaceD = MSComm1.Input
a = Split(PlaceD, ",", , vbTextCompare)
b = UBound(a)
'Label4.Caption = b
'Label3.Caption = PlaceD
GPSDataFind
End Subeli yritän tuossa split komennolla erotella tuon datan pätkän ja saankin se erilleen, mutta kun yritän siirtää tätä datan pätkää toiseen muuttujaan saan virheen expected array??
ModStrLati(m) = StrLati(m)
ja toi strlat(m) on korostettu. eli eikö se nyt ookkaan string vaan array muodossa??
kuinka saan sen pätkän semmoseen muotoon että voin suorittaa sillä lasku tehtäviä. toi strlati muuttuja näkyy labelissä 02737.8847 muodossa. eli siitä pitäs saada piste pois ja kokonais luvuks.
Heippa taas!
Ekaks: mitenkähän toi edellinen kysymys liittyy Excelin ohjaukseen VB6:lla?
Tokaks: Dim StrLati As String, ModStrLati As String * 8
olet määrittänyt muuttujat merkkijonoiksi ja sitten yrität pukata olemattomasta taulukosta 'StrLati()' olematonta alkiota 'm' olemattoman talukon 'ModStrLati()' olemattomaksi alkioksi 'm' ja sama täysin hyödytön homma jatkuu seuraavalla koodirivillä: ModStrLong(m) = StrLong(m + 1)...
Kolmanneksi: Mikäli jotakuta vielä kiinnostaa niin edellistä VB6 esimerkkiäni vastaavan VB.NET viritelmän sorsat (kommentoimattomat) voi impata täältä
kiitos näkemiin ja anteeks kauheesti.
Moi taas Arto!
tutki hieman oheista viritelmään ja sovella...
Private Sub ShowGPSData(gpsArray As Variant, IsMulti As Boolean)
Dim i As Integer
Select Case IsMulti
'tapauksessa että parametrin
'IsMulti arvo on EPÄTOSI niin...
Case False
'käydään laskurisilmukassa läpi parametrin
'gpsArray taulukon kaikki alkiot...
For i = LBound(gpsArray) To UBound(gpsArray)
'jos laskurin i osoitaman alkioindeksin
'merkkijono ei ole tyhjä niin...
If Trim(gpsArray(i)) <> "" Then
'muutama esimerkki stringin käsittelystä
'poistaa kaikki pisteet
'gpsArray(i) = Replace(gpsArray(i),".","")
'poistaa merkit oikealta alkaen pisteestä
'If InStr(gpsArray(i), ".") > 1 Then
'gpsArray(i) = Left(gpsArray(i), _
'InStr(gpsArray(i), ".") - 1)
'End If
'poistaa merkit vasemmalta alkaen pisteestä
'If InStr(gpsArray(i), ".") > 1 Then
'gpsArray(i) = Right(gpsArray(i), _
'Len(gpsArray(i)) - InStr(gpsArray(i), "."))
'End If
'näytetään taulukon, laskurin i
'osoittaman alkioindeksin, merkkijono
MsgBox gpsArray(i)
End If
Next i
Case True
'tapauksessa että parametrin
'IsMulti arvo on TOSI niin...
'märiteään laskurin i osoittaman
'arvon perusteella taulukon gpsArray
'ensimmäisen ulottuvuuden indeksi...
For i = LBound(gpsArray, 1) To UBound(gpsArray, 1)
Dim j As Integer
'ja laskurin j osoittaman arvon
'perusteella taulukon gpsArray
'toisen ulottuvuuden indeksi...
For j = LBound(gpsArray, 2) To UBound(gpsArray, 2)
If Trim(gpsArray(i, j)) <> "" Then
'ja näytetään lakuriarvojen
'osoittaman alkion merkkijono.
MsgBox gpsArray(i, j)
End If
Next j
Next i
End Select
End Sub
Private Sub Command1_Click()
MSComm1.PortOpen = True
Timer1.Enabled = True
End Sub
Private Sub Command2_Click()
Timer1.Enabled = False
MSComm1.PortOpen = False
End Sub
Private Sub Timer1_Timer()
Dim retArray As Variant
Dim IsMulti As Boolean
Dim PlaceD As String
PlaceD = MSComm1.Input
If InStr(PlaceD, vbCrLf) > 0 Then
Dim i As Integer, j As Integer
Dim cnt As Integer: cnt = -1
Dim tmpArray() As String
'jos muuttujan PlaceD merkkijono sisältää
'rivinvihtomerkkejä niin splitataan muutujan
'merkkijono string taulukkoon (tmpArray)
tmpArray = Split(PlaceD, vbCrLf)
'alustetaan kasiolotteinen merkkijono taulukko
'ja määritetään taulukon ensimäisen ulottuvuuden
'kooksi merkkijonotaulukon (tmpArray) koko ja
'ja toisen ulottuvuuden kooksi 0 (yksi alkioindeksi)
ReDim gpsArray(UBound(tmpArray), 0) As String
For i = LBound(tmpArray) To UBound(tmpArray)
'jos taulukkon tmpArray laskuriarvon i
'osottaman alkion merkkijono sisältää
'merkkijonon "$GPGGA" niin...
If InStr(tmpArray(i), "$GPGGA") > 0 Then
'jos samaisen alkion merkkijono
'sisältää pilkkuja niin splitataan
'alkion merkkijono string taulukkoon (tmp2Array)
If InStr(tmpArray(i), ",") > 0 Then
'alustetaan merkkijonotaulukko
Dim tmp2Array() As String
'ja splitataan taulukkoon tmp2Array
'merkkijonotaulukon tmpArray laskurin
'osittaman alkioindeksin merkkijono
'käyttäen erottimena pilkku merkkiä
tmp2Array = Split(tmpArray(i), ",")
For j = LBound(tmp2Array) To UBound(tmp2Array)
'jos laskurin j arvo on suurempi kuin
'taulkon gpsArray toisen ulottuvuuden
'ylin indeksi niin..
If j > UBound(gpsArray, 2) Then
'kasvatetaan taulukon toisen
'ulotuvuuden kokoa laskurin
'j osoittamalla arvolla
ReDim Preserve gpsArray(UBound(gpsArray, 1), j)
End If
'asetetaan taulukon, laskurien i ja j
'osoittaman alkioindeksin arvoksi
'taulukon tmp2Array laskurin j osittaman
'alkioindeksin merkkijonoarvo
gpsArray(i, j) = tmp2Array(j)
Next j
'pyhkäistään aputaulukko tmp2Array muistista
Erase tmp2Array
End If
End If
Next i
'jos merkkijonotaulukon gpsArray
'toisen ulottuvuuden koko on 0
If UBound(gpsArray, 2) = 0 Then
'niin ilmoitetaan käyttäjälle
'että GPS dataa ei ole...
MsgBox "Ei GPS dataa!"
'poistetaan taulukot muistista
Erase tmpArray, gpsArray
'ja poistutaan aliohjelmasta.
Exit Sub
End If
'asetetaan variant tyyppisen muuttujan
'(retArray) arvoksi taulukko (gpsArray)
retArray = gpsArray
'kutsutaan aliohjelmaa ShowGPSData
'ja välitetään aliohjelmalle parametreinä
'variant muuttuja retArray ja boolen
'operaattorin arvo TRUE joka ilmoittaa
'aliohjelmalle tässä tapauksessa, että
'ensimmäinen paramtriarvo sisältää
'kaksiulotteisen taulukon...
GPSDataShow retArray, True
'pyhkäistään taulukot muistista
Erase tmpArray, gpsArray, retArray
Else
'Jos muuttujan PlaceD merkkijono ei
'sisältänyt rivinvaihtomerkkejä niin
'tutkitaan sisältääkö merkkijono
'"$GPGGA" merkkijonon...
If InStr(PlaceD, "$GPGGA") > 0 Then
'ja jos merkkijono sisältää pilkun
If InStr(PlaceD, ",") > 0 Then
'splitataan merkkijono variant
'muuttujaan retArray...
retArray = Split(PlaceD, ",")
'kutsataan aliohjelmaa ShowGPSData
'välitetään aliohjelmalle parametreinä
'variant muuttuja retArray ja boolen
'operaattorin arvo FALSE joka ilmoittaa
'aliohjelmalle tässä tapauksessa, että
'ensimmäinen paramtriarvo sisältää
'yksiulotteisen merkkijonotaulukon.
ShowGPSData retArray, False
Erase retArray
Else
'jos merkkijono ei sisältänyt pilkkua
'niin ilmoitetaan käyttäjälle, että
'GPS dataa ei ole
MsgBox "Ei GPS dataa!"
End If
Else
'jos merkkijono ei sisältänyt
'"$GPGGA" merkkijonoa niin
'ilmoitetaan käyttäjälle, että
'GPS dataa ei ole
MsgBox "Ei GPS dataa!"
End If
End If
End SubAihe on jo aika vanha, joten et voi enää vastata siihen.