SoloCodigo
Programación General => Visual Basic 6.0 e inferiores => Mensaje iniciado por: ebolo en Viernes 30 de Enero de 2004, 11:48
-
Hola.
Aquí os pongo un código que me está dando error nº 9 de subindice (el subindice está fuera del intervalo) y no sé porque es.
Esto mismo, con otros nombres de variables, lo tengo puesto en otro programa y no me dá error.
-----------------------------------------
Private Sub Command6_Click()
Dim mensaje As String
Dim respuesta() As Byte, q As Integer
Dim respq(1 To 8) As Long
Dim mensrec As String, tempo As Double
If MSComm1.PortOpen = False Then
MsgBox "Abrir puerto primero"
Exit Sub
End If
If Text1.Text <> "" Then
mensaje = ""
For q = 1 To Len(Text1.Text) Step 2
mensaje = mensaje & Chr$(Mid$(Text1.Text, q, 2))
Next q
MSComm1.Output = mensaje
End If
tempo = Timer
Do
resp = MSComm1.Input
'On Error GoTo errorp
If MSComm1.InBufferCount >= 8 Then
MsgBox MSComm1.InBufferCount
'Call tramitarespuesta(respuesta)
For q% = 1 To 8
resp(q%) = respuesta(q% - 1) '----AQUÍ ME DA EL ERROR
If (q% = 3) Or (q% = 4) Or (q% = 5) Then
resp(q%) = Val(Hex$(respuesta(q%)))
End If
MsgBox "respq(" & q% & "):" & resp(q%)
mensrec = mensrec & resp(q%)
Next q%
Text3.Text = Text3.Text & mensrec
End If
If (tempo) > (Timer + 5) Then
tempo = Timer
End If
Text3.Text = Timer
Loop Until (Timer - 5) > tempo
Exit Sub
errorp:
If Err.Number <> 0 Then
MsgBox "Error"
Resume Next
End If
End Sub
-----------------------------------------------
Si sabeis que puede ser me podriais echar una mano.
Saludos.
-
Hola!
Error no es de las variables, es del contador, si tienes un contador de 1-8 tienes 8 posisciones, si la longitud de la cadena supera este intervalo entonces el contador tratara de llegar a dicha longitud, entonces alli supera el numero de elementos que tienes reservados para la matriz y se produce ese error, en definitiva tu bucle esta superando el numero de valores que puede tomar..
Saludos :hola:
-
Gracias carlosjrey por la rápida respuesta.
He modificado el código pero me sigue dando el mismo error.
---------------------------------------------
Private Sub Command6_Click()
Dim mensaje As String
Dim respuesta() As Byte
Dim q, t As Integer
ReDim respq(1 To 8) As Long
Dim mensrec As String, tempo As Double
If MSComm1.PortOpen = False Then
MsgBox "Abrir puerto primero"
Exit Sub
End If
If Text1.Text <> "" Then
mensaje = ""
For t = 1 To Len(Text1.Text) Step 2
mensaje = mensaje & Chr$(Mid$(Text1.Text, t, 2))
Next t
MSComm1.Output = mensaje
End If
tempo = Timer
Do
respuesta = MSComm1.Input
'On Error GoTo errorp
If MSComm1.InBufferCount >= 8 Then
MsgBox MSComm1.InBufferCount
'Call tramitarespuesta(respuesta)
For q = 1 To 8
respq(q) = respuesta(q - 1)
If (q = 3) Or (q = 4) Or (q = 5) Then
respq(q) = Val(Hex$(respuesta(q)))
End If
MsgBox "respq(" & q & "):" & respq(q)
mensrec = mensrec & respq(q)
Next q
Text3.Text = Text3.Text & mensrec
End If
If (tempo) > (Timer + 5) Then
tempo = Timer
End If
Text3.Text = Timer
Loop Until (Timer - 5) > tempo
Exit Sub
errorp:
If Err.Number <> 0 Then
MsgBox "Error"
Resume Next
End If
End Sub
-------------------------------------------------
Saludos.
-
Gracias carlosjrey por la rápida respuesta.
He modificado el código pero me sigue dando el mismo error.
---------------------------------------------
Private Sub Command6_Click()
Dim mensaje As String
Dim respuesta() As Byte
Dim q, t As Integer
ReDim respq(1 To 8) As Long
Dim mensrec As String, tempo As Double
If MSComm1.PortOpen = False Then
MsgBox "Abrir puerto primero"
Exit Sub
End If
If Text1.Text <> "" Then
mensaje = ""
For t = 1 To Len(Text1.Text) Step 2
mensaje = mensaje & Chr$(Mid$(Text1.Text, t, 2))
Next t
MSComm1.Output = mensaje
End If
tempo = Timer
Do
respuesta = MSComm1.Input
'On Error GoTo errorp
If MSComm1.InBufferCount >= 8 Then
MsgBox MSComm1.InBufferCount
'Call tramitarespuesta(respuesta)
For q = 1 To 8
respq(q) = respuesta(q - 1)
If (q = 3) Or (q = 4) Or (q = 5) Then
respq(q) = Val(Hex$(respuesta(q)))
End If
MsgBox "respq(" & q & "):" & respq(q)
mensrec = mensrec & respq(q)
Next q
Text3.Text = Text3.Text & mensrec
End If
If (tempo) > (Timer + 5) Then
tempo = Timer
End If
Text3.Text = Timer
Loop Until (Timer - 5) > tempo
Exit Sub
errorp:
If Err.Number <> 0 Then
MsgBox "Error"
Resume Next
End If
End Sub
-------------------------------------------------
Saludos.
For q% = 1 To 8
resp(q%) = respuesta(q% - 1) '----AQUÍ ME DA EL ERROR
If (q% = 3) Or (q% = 4) Or (q% = 5) Then
resp(q%) = Val(Hex$(respuesta(q%)))
End If
' se supone que cuando inicias el bucle, tu contador va de 1 hasta 8, si restas 1 a q%, el primer valor que toma es 0, es decir: 1-1 =0, y el intervalo es ascendente de 1 a 8, le estas restamdo valores a q% y mas bien creo que debieras de agragarle y ni si quiera creo que eso sea necesario por que el bucle for..next por defecto te suma 1, si colocas step 2 te suma 2 y asi sucesivamente..
:whistling:
-
Nada que no hay manera, no sé donde fallo, yo te entiendo carlosjrey lo que me comentas; le resto a la variable respuesta(q-1) porque es de tipo byte, y el primer valor que llega con el MSComm1.input es el (0).
Lo he metido en un módulo por separar la respuesta y tratarla, pero me sigue dando el mismo error.
He vuelto a modificar un poco el código:
------------------------------------
Private Sub Command6_Click()
Dim mensaje
Dim tempo As Double
Dim respuesta() As Byte
If MSComm1.PortOpen = False Then
MsgBox "Abrir puerto primero"
Exit Sub
End If
If Text1.Text <> "" Then
mensaje = ""
checksum% = (Val(Text1.Text) + Val(Text4.Text) + 0 + 0 + 0 + 63) Mod (256)
'MsgBox checksum%
mensaje = Chr$(Val(Text1.Text)) & Chr$(Val(Text4.Text)) & Chr$(0) & Chr$(0) & Chr$(0) & Chr$(63) & Chr$(checksum) & Chr$(13)
MSComm1.Output = mensaje
End If
tempo = Timer
Do
respuesta = MSComm1.Input
'On Error GoTo errorp
If MSComm1.InBufferCount >= 8 Then
MsgBox MSComm1.InBufferCount
Call Tramitarespuesta(respuesta())
End If
Loop Until (Timer - 5) > tempo
End Sub
Sub Tramitarespuesta(respuesta)
Dim X As Integer
ReDim respq(1 To 8) As Long
Dim mensrec As String, tempo As Double
For X% = 1 To 8
MsgBox Form1.MSComm1.Input
respq(X%) = respuesta(X% - 1)
If (X% = 3) Or (X% = 4) Or (X% = 5) Then
respq(X%) = Val(Hex$(respuesta(X%)))
End If
MsgBox "respq(" & X% & "):" & respq(X%)
mensrec = mensrec & respq(X%)
Next X%
Text3.Text = Text3.Text & mensrec
If (tempo) > (Timer + 5) Then
tempo = Timer
End If
Text3.Text = Timer
Exit Sub
errorp:
If Err.Number <> 0 Then
MsgBox "Error"
Resume Next
End If
End Sub
------------------------------------------------
Saludos y gracias por la ayuda.
-
Después de comprobar con Ubound, he visto que no me coge bien el input, me da valor 1 cuando debiera ser 7, pero no sé porque es porque en un programa me lo hace bien y en el otro, que sólo cambia en principio el diseño, no.
Saludos.
-
Solucionado. llevo todo el día con ello y la cabeza echa un bombo.
Tenía puesta la línea de "respuesta=MSComm1.Imput" fuera de la condición:
If MSComm1.InBufferCount >= 8 Then
y tenía que estar dentro de la condición.
Eso me producía el error de la matriz, porque sólo me vale el input que tiene 8 byte, y estaba igualando "respuesta=" a cualquier valor del input.
Saludos. :hola: :brickwall: :brickwall: