|
前面发个[VBA运行中修改表数据的一个方法],其主要过程是程序在运行时中断,操作表
修改数据后再调用程序接续运行.虽然是一种解决问题的方案,但操作表会带来不确定性,
而且程序结构也不够好.
下面提出一种不中断程序,利用窗体控件ListBox修改表数据的方法.只是一个例题,故有些简略.
1 程序运行时,产生的表数据存入全局公共二维数组PArr()中,用于在表与窗体间转移数据.
ReDim PArr(1 To PDou, 1 To 2) 'PDou为行数(列数据个数),第1列为序号,第2列是待修改的
For i = 1 To PDou
PArr(i, 1) = i '序号从1开始计
PArr(i, 2) = Arr(i) 'Arr(i)为程序产生的待修改数据
Next i
下面的代码都在窗体上.
2 在窗体的控件ListBox1中写入数组数据.为简洁,ListBox1的列名可用标签给出
Private Sub UserForm_Activate()
With Me.ListBox1
.ColumnCount = 2 '设置两列
.ColumnWidths = "50;100" '设置列宽
.List = PArr '赋值
End With
End Sub
3 控件ListBox1的MultiSelect 属性设置为单选(默认),其代码如下:
Private Sub ListBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
k = Me.ListBox1.ListIndex 'k为窗体上的公共变量,存放单选序号(从0到PDou-1)
Me.Label2.Caption = k + 1 '标签Label2显示要修改项的序号
Me.TextBox1.Text = PArr(k + 1, 2) '值传入TextBox1,以待修改
Me.TextBox1.SetFocus '焦点移到TextBox1
End Sub
控件TextBox1的代码如下:
Private Sub TextBox1_Change()
PArr(k + 1, 2) = Me.TextBox1.Text '修改后的值传给数组
With Me.ListBox1 '即刻更新ListBox1的数据
.List = PArr
End With
End Sub
4 在窗体的按钮中写入代码:
Private Sub CommandButton1_Click()
Dim i As Long
Sheets("mytab1").Select '已建的空表
For i = 1 To PDou '将修改后的数据传回表
Cells(i, 1) = i
Cells(i, 2) = PArr(i, 2)
Next i
Unload UserForm1
End Sub
总体思路是利用全局数组传递数据,并更新控件ListBox1中的数据;ListBox1的作用是
选择要修改的项并显示修改的结果(原因是ListBox1的数据不能直接修改);在TextBox1
修改,用命令按钮将数据传到表中.这样相当于用程序完成了表数据的修改.
多列的修改或ListBox1的MultiSelect 属性设置为多选(行多选),都会使程序复杂了.也
可在命令按钮中编制检验修改数据的代码.这里只是提出一个解决问题的思路,供大家
参考.
用附加控件Listview也应是解决这个问题的好方法.但那是另一个要研究的问题了.
|
|