注册 登录
编程论坛 VB6论坛

求vb将VSFlexgrid或MSFlexGrid表格中b列各单元格中的数据坼分到每一个单元格中的vb程序

vbcaonia 发布于 2016-05-18 22:43, 4177 次点击
1、单元格b5开始的b列各单元格中填有不同数字, 每二个数字间空一格,

2、b列各单元格从上到下,数据逐个分开,分开后的数字依次填充在同行c5开始的各个单元格(每个单元格一个数据),即b5分开后的数据填充到 c5 行各个单元格,即b6行分开后的数据填充到 c6 行各个单元格...
如:b5的数据坼分到:c5、d5、e5、f5
    b6的数据坼分到:c6、d6、e6、f6
             ......

下面的程序是我用excel做的,就是想在VSFlexgrid或MSFlexGrid表格中实现这个目的:

Sub 按钮2_Click()
Range("c5:k750004").Clear 'Contents
Dim x As Long
arr = Range("b5:b" & Range("b1048576").End(xlUp).Row)
For x = LBound(arr) To UBound(arr)
    brr = Split(Trim(arr(x, 1)), " ")
    ReDim crr(UBound(brr))
    For j = 0 To UBound(brr)
        crr(j) = Val(brr(j))
    Next
Range("e" & x + 4).Resize(1, UBound(crr) + 1) = crr
Next
End Sub

只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2016-5-19 09:45编辑过]

16 回复
#2
hjxlj2016-05-19 00:38
楼主这样的描述不好理解,建议截个图上来
#3
xiangyue05102016-05-19 08:35
跟你excel的做法可以说是完全一样的,只是因为对象不同代码有点差异而已。不清楚你什么地方有问题。
#4
vbcaonia2016-05-19 09:29
回复 2楼 hjxlj
附件就是
#5
vbcaonia2016-05-19 09:44
回复 3楼 xiangyue0510
版主你好,就VSFlexGrid而言:主要是第1句输入到数组和最后一句数组输出,麻烦版主修改修改,谢谢!

1、第一句输入这样写不知对不对:arr=VSFlexGrid1.Cell(flexcpText, 5, 2, VSFlexGrid1.Rows - 1, 2);


2、最后一句数组输出:Range("e" & x + 4).Resize(1, UBound(crr) + 1) = crr 中的Range("e" & x + 4)用什么代替或整句修改;

这样好像不对:VSFlexGrid1.Cell(flexcpText, 1, 3).Resize(1, UBound(crr) + 1) = crr

3、For x = LBound(arr) To UBound(arr)这句好像不能用显示类型不匹配?


[此贴子已经被作者于2016-5-19 10:42编辑过]

#6
xiangyue05102016-05-19 16:05
Excel对象和VSFlexGrid对象的属性、事件、子对象肯定是不同的

http://wenku.baidu.com/link?url=mvHEZEtOEuBDR-drc_bw9w694y8erCEoU7QPj2nhZ8CUVO-btd9cC0iz9xfaEq0udi8ojaJhb4I4Bd8lb-PNjDkkNMueG0_4lPRMuayllM_
1、第一句输入这样写不知对不对:arr=VSFlexGrid1.Cell(flexcpText, 5, 2, VSFlexGrid1.Rows - 1, 2);
2、最后一句数组输出:Range("e" & x + 4).Resize(1, UBound(crr) + 1) = crr 中的Range("e" & x + 4)用什么代替或整句修改;
3、For x = LBound(arr) To UBound(arr)这句好像不能用显示类型不匹配?

Excel支持Range,但是VSFlexGrid未必支持这样的操作
虽然没有用过VSFlexGrid,但是好像Cell只有两个参数吧,行、列
百度了一段,简单的修改了一下。 列宽你自己百度一下吧

程序代码:

for i=1 to grid1.rows-1

 brr =split(grid1.textmariy(i,0)," ")   '第一格是放你原始数的
k=1

 For j= lbound(brr) to ubound(brr)
  if trim(brr(j))<>"" then
      grid1.textmariy(i,k)=brr(j)    '这里注意,如果一行拆分出来的数值个数不同的话,要用最大的。如果不确定,那就要加代码判断并调整列数
      k=k+1
  End if     

 Next j
next i
#7
vbcaonia2016-05-19 17:10
回复 6楼 xiangyue0510
版主你好,按照你的说的(当然我没有完全理解)我把整个程序写成这样:
Private Sub Command2_Click()
Dim textmariy, brr(), crr, i As Long, j As Long, k As Long
textmariy = VSFlexGrid1.Cell(flexcpText, 1, 0, 4, 0)
For i = 1 To 4
 brr = Split(VSFlexGrid1.textmariy(i, 0), " ") '第一格是放你原始数的
k = 1
 For j = LBound(brr) To UBound(brr)
  If Trim(brr(j)) <> "" Then
      VSFlexGrid1.textmariy(i, k) = brr(j) '这里注意,如果一行拆分出来的数值个数不同的话,要用最大的。如果不确定,那就要加代码判断并调整列数
      k = k + 1
  End If
 Next j
Next i
End Sub

这句有问题:brr = Split(VSFlexGrid1.textmariy(i, 0), " ")提示对象和属性不支持

麻烦你再看看并修改,或用MSFlexGrid来一段,   谢谢!


[此贴子已经被作者于2016-5-19 19:48编辑过]

#8
hjxlj2016-05-20 00:51
回复 7楼 vbcaonia
还没有解决吗?我也是醉了。
#9
xiangyue05102016-05-20 09:05
回复 7楼 vbcaonia
VSFlexGrid1.TextMatriy 改成VSFlexGrid1.TextMatrix 我是百度上找了一段例子给你改的,可能是修改的时候弄错了。你再试试吧
我昨天的意思是,要用这个控件必须好好的看一下控件属性、事件。
VSFlexGrid的属性方法,好好看一下。
http://wenku.baidu.com/link?url=m28SgvC5Zlk9agQJ6HO2hwEfyG59ebvsQ7WkbjY2oCM3-DESyWyRxEuD9MMziGlfiyZkTuPk1xmokwHRHg4VvSkMMhOFcfQtWxxP5fUw1Qu
#10
vbcaonia2016-05-20 11:06
回复 9楼 xiangyue0510
谢谢版主指点!
#11
ZHRXJR2016-05-20 16:32
刚刚看到这个问题,给你做一个,稍等。
只有本站会员才能查看附件,请 登录
没有点击【转移】按钮的界面
只有本站会员才能查看附件,请 登录
点击【转移】按钮的界面
启动与通用部分:
程序代码:
Dim AA
Private Sub Form_Load()
AA = Array("1 2 3 4", "5 9 10 11", "7 8 12 32", "99 10 12 77")
With MSFlexGrid1
    .Cols = 1
    .Rows = 5
    .TextMatrix(0, 0) = "A"
    .ColWidth(0) = 1200
    For I = 1 To 4
    .TextMatrix(I, 0) = AA(I - 1)
    Next I
End With
With MSFlexGrid2
    .Cols = 1
    .Rows = 1
End With
End Sub

【转移】按钮单击事件:
程序代码:
Private Sub Command1_Click()
Dim BB, CC, DD, EE
BB = Split(MSFlexGrid1.TextMatrix(1, 0), " ", -1, 1)    '使用Split将MSFlexGrid1第一列数据分解到数组BB中,下同
CC = Split(MSFlexGrid1.TextMatrix(2, 0), " ", -1, 1)
DD = Split(MSFlexGrid1.TextMatrix(3, 0), " ", -1, 1)
EE = Split(MSFlexGrid1.TextMatrix(4, 0), " ", -1, 1)
MSFlexGrid2.Clear
With MSFlexGrid2
    .Cols = 5
    .Rows = 5
    .TextMatrix(0, 0) = "A"
    .TextMatrix(0, 1) = "B"
    .TextMatrix(0, 2) = "C"
    .TextMatrix(0, 3) = "D"
    .TextMatrix(0, 4) = "E"
    .ColWidth(0) = 1200
    .ColWidth(1) = 700
    .ColWidth(2) = 700
    .ColWidth(3) = 700
    .ColWidth(4) = 700
    For I = 1 To 4
    .TextMatrix(I, 0) = AA(I - 1)  '循环列,添加第一列数据
    .TextMatrix(1, I) = BB(I - 1)  '循环行,添加第一行数据
    .TextMatrix(2, I) = CC(I - 1)  '循环行,添加第二行数据
    .TextMatrix(3, I) = DD(I - 1)  '循环行,添加第三行数据
    .TextMatrix(4, I) = EE(I - 1)  '循环行,添加第四行数据
    Next I
End With
End Sub


[此贴子已经被作者于2016-5-20 17:15编辑过]

#12
vbcaonia2016-05-20 21:18
回复 11楼 ZHRXJR
老师你好。学习了你的代码,我想问一下:AA = Array("1 2 3 4", "5 9 10 11", "7 8 12 32", "99 10 12 77")能否改成区间赋值即将b列从b5开始到b列有数据的地方为止赋值到数组(像excel:arr = Range("b5:b" & Range("b1048576").End(xlUp).Row)),实际运用中b列的数据有600-900万行,因而不可能逐个输入、输出,我求这个代码的目的就是想把excel的大量数据移到vb来处理(目前没有找到好的表格控件就只好先学MSFlexGrid),因而麻烦老师把这个程序按b列有几百万行数据的要求来写,谢谢!

[此贴子已经被作者于2016-5-20 21:20编辑过]

#13
vbcaonia2016-05-20 22:32
回复 11楼 ZHRXJR
老师你好,根据你的代码提示,我已把它写成循环式,成功啦:
Private Sub Command2_Click()
Dim BB, i As Integer, k As Integer, m As Integer
m = 1
For i = 1 To 4
BB = Split(VSFlexGrid1.TextMatrix(i, 0), " ") '使用Split将MSFlexGrid1数据分解到数组BB中
For k = 0 To UBound(BB)
VSFlexGrid1.TextMatrix(m, k + 1) = BB(k) '输出结果
  Next
   m = m + 1
   Next
End Sub


[此贴子已经被作者于2016-5-20 23:25编辑过]

#14
ZHRXJR2016-05-20 23:57
回复 13楼 vbcaonia
祝贺你,你原来说的是一个列分解,仅仅按你的要求做的,如果你是Excel导入,也应该不是问题,但难度稍稍大一点而已。
#15
vbcaonia2016-05-21 10:50
回复 14楼 ZHRXJR
老师你好,请教一下,在标签1中显示第二列填有数据行的总行数怎样写,谢谢!


另外关于数据库导入数据的问题,麻烦老师有时间看看:

为什么记事本数据txt导入到Access数据库时数据被分解
1、数据库中建有一个表, 表名为:表1,表1中有1个字段,其名为:数据1
2、现将txt文本数据按行导入即数据不分割,每一行txt文本数据在表1占据一个单元格也就是将txt文本数据复制到字段1。

如面数据
2 06 11
09 13 15
02 05 07
08 09 17


3、用下全面的程序导入后,数据被分解了,请老师修改,谢谢!

Private Sub Command9_Click()
Dim g
Dim Con As New ADODB.Connection
Dim rs As New ADODB.Recordset
Con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=F:\vb-数据库学习\db11.mdb;Persist Security Info=False"
Con.Open
 Open App.Path & "\AA.txt" For Input As #1
Do While Not EOF(1)
Input #1, g
Con.Execute ("insert into 表1(数据1) values( " & g & ")")
Loop
Close #1
ErrHandler:
' 用户按了“取消”按钮
Exit Sub

End Sub


只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2016-5-21 12:03编辑过]

#16
ZHRXJR2016-05-21 17:25
程序代码:
Private Sub Command9_Click()
Dim g As String
Dim Con As New ADODB.Connection
Dim rs As New ADODB.Recordset
Con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=F:\vb-数据库学习\db11.mdb;Persist Security Info=False"
Con.Open

 Open App.Path & "\AA.txt" For Input As #1
Do While Not EOF(1)
Input #1, g
Con.Execute ("insert into 表1(数据1) values( '" & g & "')")
Loop
Close #1
Exit Sub
ErrHandler:

 用户按了“取消”按钮
End Sub

这样就应该可以了,因为 values( " & g & ")是按数字处理的,修改为上面的,就是字符串。
#17
vbcaonia2016-05-21 21:00
回复 16楼 ZHRXJR
老师你好,经测试程序满足要求,谢谢!
1