注册 登录
编程论坛 VB6论坛

二维数组赋值的问题

sunduke 发布于 2016-04-22 08:46, 9257 次点击
大家好,问题是这样的,我要用多个文本框的方式对我想要的不定行数的数组a(n,4)进行赋值,因为n是我程序中的一个变量不确定为多少,参考一个教程的代码如下,代码用的是对a(3,4)数组的赋值,然而我用redim的方法无法实现,详细代码如下,期望高手把我改改,或者还是我出发的思维就错了,有别的更加好的方法?
程序代码:
Private Sub Command1_Click()
Static a(3, 4) As Integer     '声明 数组
Static i As Integer
For j = 0 To 4        '取文本框控件数组接收到的数据存入二维数组中
  a(i, j) = Val(Text1(j).Text)     '一次提取一行
Next j
For j = 0 To 4
  Text1(j) = ""       '提取一行后清空文本框
Next j
If i = 2 Then          '将要结束时提示可以打印
  Command1.Caption = "打印"
End If
If i = 3 Then
  Label1.Caption = "输入结束,开始处理数据" '数据都提取完毕后提示处理打印
  Command1.Caption = "打印"
  Print: Print: Print: Print
  Print "您 输入的矩阵为:"
  For k = 0 To 3                      '以3行4列的矩阵方式输出数组元素
    For j = 0 To 4
       Print Tab(6 * j); a(k, j);     '在窗体上有间隔的输出
    Next j
    Print
  Next k
  Exit Sub
Else
  i = i + 1
  Label1.Caption = "请您 输入第" & i + 1 & "行数据"     '提示继续输入
  Text1(0).SetFocus                   '光标重新定位
End If
End Sub

Private Sub Text1_GotFocus(Index As Integer) '当文本框控件数组中任何一个控件失去焦点时发生
n = Index
Text1(n).SelStart = 0
Text1(n).SelLength = Len(Text1(n).Text)     '事件发生时文本框内的内容全部选中
End Sub
7 回复
#2
xiangyue05102016-04-22 09:02
你的这个需求应该是要ReDim Preserve。只是ReDim 前面的赋值会被清空的
如果使用了 Preserve 关键字,就只能重定义数组最末维的大小
ReDim Preserve ca(x,y) 也就是说只能修改y值

你的情况我觉得可以用Grid控件,mshflexgrid或者datagrid
http://wenku.baidu.com/link?url=HLOMfxrpxE71ZgIFLrZi0wCkEkfsiP8d4nZ4HbOqb1mCCLdYeiAIro4X5-8fvKW7X6VDFqGNvVFYgTBH9rCiocs9iJsXtmio0bmiwkI6wki
上面弄一个Combobox或者text,要用N就选择(输入)N就可以了。
#3
风吹过b2016-04-22 09:03
1,申明静态数组时,无法重定义大小。如你这种,
Static a(3, 4) As Integer     '声明 数组
就无法使用
redim 函数了。
必须申明为动态数组,才能重定义大小
Static a() As Integer     '声明 数组
redim a(3,4)              '设置大小

2、redim 函数,如果需要保存内容的情况下,只能重定义最后一维。
#4
sunduke2016-04-22 09:22
回复 3楼 风吹过b
变为动态数组后,redim perseve或者redim什么的都不行,改了后就只能输出一行数组,多行的不行了。也不能实现我反复用一组文本框输入数据,然后得出二维数组,不过还是谢谢了!
#5
sunduke2016-04-22 09:28
回复 2楼 xiangyue0510
用datagrid的方法我想到了存入数据库,然后再变为二维数组,不过貌似也麻烦,就是想找个能直接输入生成二维数组,用inputbox其实可以实现,但是感觉太low了,我后面要进行特别复杂的数据公式运算,而且可以数组行数很多,inputbox就太麻烦了。
不知道有没有用datagrid直接变数组的方法,因为datagrid的删除和添加数据的确很方便。
#6
xiangyue05102016-04-22 09:35
回复 5楼 sunduke
干嘛要存入数据库?按照你示例的那样,只是展示用的,直接在Grid中手动输入就可以了。
#7
sunduke2016-04-22 09:58
已经实现了,说下方法和思路吧。
    因为要编一个公司内部的计算软件,需要手动输入一个动态二维数组,用inputbox方法繁琐,用text文本框输入成为一个二维数据(自己没看明白,也没成果,因为涉及到要用同一个文本框组反复对数组赋值,不知道如何操作)。然后发现datagrid这个控件本身来说就有添加删除修改的功能(样子类似excel),datagrid是直接跟数据库相连的,然后把数据库变为二维数组,即可实现我的要求了。
前面连接数据库的代码就不写了,也很简单。
Rst.MoveLast    ''前面定义Rst = New ADODB.Recordset
i = Rst.RecordCount - 1
j = Rst.Fields.Count - 1
'3 利用循环赋值
ReDim A(i, j) As Variant
For m = 0 To i
If m > 0 Then
Rst.MoveNext
If Rst.EOF Then
Rst.MoveLast
End If
Else
Rst.MoveFirst
End If
For n = 0 To j
A(m, n) = Rst.Fields(n)
Print A(m, n);
Next n
Print
Next m
Cnn.Close
#8
风吹过b2016-04-22 10:23
redim perseve或者redim什么的都不行,改了后就只能输出一行数组,多行的不行了
二个解决方案:一个是方案是 维数反写。
需要变化的放到最后。
如每组数据是 4个元素,不定组数。

定义为:
redim a(4,1)
redim perseve  a(4,2)
redim perseve  a(4,3)
--------例,无错误处理-----------
Dim a() As Long         '保存的内容
Dim j As Long           '计数

Private Sub Command1_Click()
j = j + 1
ReDim Preserve a(4, j)
Dim s() As String
Dim i As Long
s = Split(Text1.Text, " ")
For i = 0 To 3
    a(i + 1, j) = Val(s(i))
Next i
End Sub
----------------------
二种,就是你用的,保存到数据库或者表格控件中。不建议
1