数据(text)合并有关问题
数据(text)合并问题
程序界面很简单,有数组文本框分别为:
text1(0-5),text2(0-5),text3(0-5),txtqty(0-5)
里面都填有数据,其中text1--text3里面都是字符串,txtqty里面是数值。
要把text1,text2,text3的数据合并,txtqty的数值相加。
如:
text1(0)=123 text2(0)=357 text3(0)=259 txtqty(0)=25
text1(1)=113 text2(1)=357 text3(1)=251 txtqty(1)=26
text1(2)=130 text2(2)=307 text3(2)=259 txtqty(2)=12
text1(3)=130 text2(3)=307 text3(3)=259 txtqty(3)=12
text1(4)=123 text2(4)=337 text3(4)=259 txtqty(4)=8
text1(5)=123 text2(5)=357 text3(5)=259 txtqty(5)=15
点合并按钮,就可以把,就可以把第一条数据和第六条数据合并,第三条和第四条数据合并(因为text1,text2,text3三个数据同时相同)同事把txtqty相加。合并后数据如下:
text1(0)=123 text2(0)=357 text3(0)=259 txtqty(0)=40
text1(1)=113 text2(1)=357 text3(1)=251 txtqty(1)=26
text1(2)=130 text2(2)=307 text3(2)=259 txtqty(2)=24
text1(4)=123 text2(4)=337 text3(4)=259 txtqty(4)=8
请教各位如何解决??非常感谢
------解决思路----------------------
使用一个 ListBox 控件,可以将其 Visible 属性设置为 False。
此代码会将数据集中到前面的 TextBox 数组元素,而不是像你的例子中保留在原位。
------解决思路----------------------
首条数据保留在原位的写法。
------解决思路----------------------
可以试试使用字典:
------解决思路----------------------
这种业务用数据库,就是简单的分组合计,用表格显示更是简单。
用控件数组就是上世纪九十年代纯教学的老师才会用。
程序界面很简单,有数组文本框分别为:
text1(0-5),text2(0-5),text3(0-5),txtqty(0-5)
里面都填有数据,其中text1--text3里面都是字符串,txtqty里面是数值。
要把text1,text2,text3的数据合并,txtqty的数值相加。
如:
text1(0)=123 text2(0)=357 text3(0)=259 txtqty(0)=25
text1(1)=113 text2(1)=357 text3(1)=251 txtqty(1)=26
text1(2)=130 text2(2)=307 text3(2)=259 txtqty(2)=12
text1(3)=130 text2(3)=307 text3(3)=259 txtqty(3)=12
text1(4)=123 text2(4)=337 text3(4)=259 txtqty(4)=8
text1(5)=123 text2(5)=357 text3(5)=259 txtqty(5)=15
点合并按钮,就可以把,就可以把第一条数据和第六条数据合并,第三条和第四条数据合并(因为text1,text2,text3三个数据同时相同)同事把txtqty相加。合并后数据如下:
text1(0)=123 text2(0)=357 text3(0)=259 txtqty(0)=40
text1(1)=113 text2(1)=357 text3(1)=251 txtqty(1)=26
text1(2)=130 text2(2)=307 text3(2)=259 txtqty(2)=24
text1(4)=123 text2(4)=337 text3(4)=259 txtqty(4)=8
请教各位如何解决??非常感谢
------解决思路----------------------
使用一个 ListBox 控件,可以将其 Visible 属性设置为 False。
Private Declare Function SendMessagebyString Lib "user32" Alias "SendMessageA" (ByVal hWND As Long, _
ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long
Private Const LB_FINDSTRINGEXACT = &H1A2 '在 ListBox 中精确查找
Private Sub cmdMerge_Click()
Dim i As Long, n As Long, strTmp As String, strItem() As String
For i = 0 To 5
strTmp = Text1(i) & "
------解决思路----------------------
" & Text2(i) & "
------解决思路----------------------
" Text3(i)
if Len(strTmp) > 2 Then
n = SendMessagebyString(List1.hWnd, LB_FINDSTRINGEXACT, -1, strTmp)
If n = -1 Then
List1.AddItem strTmp
List1.ItemData(List1.NewIndex) = txtqty(i)
Else
List1.ItemData(j) = List1.ItemData(j) + txtqty(i)
End If
End If
Text1(i) = ""
Text2(i) = ""
Text3(i) = ""
txtqty(i) = ""
Next i
For i = 0 To List1.ListCount - 1
strItem = Slip(List1.List(i), "
------解决思路----------------------
")
If Ubound(strItem) >= 2 Then
Text1(i) = strItem(0)
Text2(i) = strItem(1)
Text3(i) = strItem(2)
txtqty = List1.ItemData(i)
End If
Next i
End Sub
此代码会将数据集中到前面的 TextBox 数组元素,而不是像你的例子中保留在原位。
------解决思路----------------------
首条数据保留在原位的写法。
Private Declare Function SendMessagebyString Lib "user32" Alias "SendMessageA" (ByVal hWND As Long, _
ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long
Private Const LB_FINDSTRINGEXACT = &H1A2 '在 ListBox 中精确查找
Private Sub cmdMerge_Click()
Dim i As Long, n As Long, strTmp As String, strItem() As String
List1.Clear '上面的代码如果反复用的话,也要加上这一句
For i = 0 To 5
strTmp = Text1(i) & "
------解决思路----------------------
" & Text2(i) & "
------解决思路----------------------
" Text3(i)
if Len(strTmp) > 2 Then
n = SendMessagebyString(List1.hWnd, LB_FINDSTRINGEXACT, -1, strTmp)
If n = -1 Then
List1.AddItem strTmp
List1.ItemData(List1.NewIndex) = i '记住首条数据的位置
Else
txtqty(List1.ItemData(n)) = Val(txtqty(List1.ItemData(n))) + Val(txtqty(i))
Text1(i) = ""
Text2(i) = ""
Text3(i) = ""
txtqty(i) = ""
End If
End If
Next i
End Sub
------解决思路----------------------
可以试试使用字典:
Sub test()
Dim iDic As New Dictionary, i As Integer, w1 As String, ww
For i = 0 To 5
w1 = text1(i).Text & "," & text2(i).Text & "," & text3(i).Text
iDic(w1) = CStr(Val(iDic(w1)) + Val(txtqty(i).Text))
Next
''打印输出
For Each ww In iDic.Keys
Debug.Print ww, iDic(ww)
Next
End Sub
------解决思路----------------------
Private Sub Command1_Click()
Dim i As Long '更新的行'
Dim j As Long '循环的行'
Dim k As Long '查找相同的行'
i = 0
For j = 0 To 5
If LenB(Text1(j).Text) <> 0 Then '跳过空行'
If i <> j Then '前面有空行,移上去'
Text1(i) = Text1(j): Text1(j) = vbNullString
Text2(i) = Text2(j): Text2(j) = vbNullString
Text3(i) = Text3(j): Text3(j) = vbNullString
txtqty(i) = txtqty(j): txtqty(j) = vbNullString
End If
For k = j + 1 To 5
If (Text1(i) = Text1(k)) And _
(Text2(i) = Text2(k)) And _
(Text3(i) = Text3(k)) Then '相等,合并'
txtqty(j) = CLng(txtqty(j)) + CLng(txtqty(k))
Text1(k) = vbNullString
Text2(k) = vbNullString
Text3(k) = vbNullString
txtqty(k) = vbNullString
End If
Next
i = i + 1
End If
Next
'调试输出'
For i = 0 To 5
If LenB(Text1(i).Text) <> 0 Then
Debug.Print i, Text1(i), Text2(i), Text3(i), txtqty(i)
End If
Next
End Sub
0 123 357 259 40
1 113 357 251 26
2 130 307 259 24
3 123 337 259 8
这种业务用数据库,就是简单的分组合计,用表格显示更是简单。
用控件数组就是上世纪九十年代纯教学的老师才会用。