Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2827|回复: 10

[已解决]请hwc2ycy师帮忙解决。谢谢!

[复制链接]
发表于 2013-8-21 16:49 | 显示全部楼层 |阅读模式
谢谢hwc2ycy师再帮忙看下。谢谢!
2(4级).zip (25.55 KB, 下载次数: 13)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2013-8-21 16:54 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2013-8-21 17:00 | 显示全部楼层
我心飞翔410 发表于 2013-8-21 16:54
点名花亲的 我们旁边站 肯定不会

谢谢,这个问题刚才hwc2ycy师帮忙过!
回复

使用道具 举报

发表于 2013-8-21 18:16 | 显示全部楼层
不知道理解对不对,我理解为你双击查询相关的数据。
  1. Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
  2.     Dim sql$, I%, r%
  3.     Set cnn = CreateObject("ADODB.Connection")
  4.     Set rst = CreateObject("ADODB.Recordset")
  5.     With Sheets("Sheet3")
  6.         r = .Range("a65536").End(xlUp).Row
  7.     End With
  8.     cnn.Open "Provider =Microsoft.Jet.OLEDB.4.0;Extended properties= Excel 8.0;Data source=" & ThisWorkbook.FullName
  9.     With TreeView1
  10.         For I = 1 To .Nodes.Count
  11.             If .Nodes(I).Children = 0 Then
  12.                 If .Nodes(I).Selected Then
  13.                     .Nodes(I).Image = 4
  14.                 Else
  15.                     .Nodes(I).Image = 3
  16.                 End If
  17.             End If
  18.         Next
  19.     End With

  20.     On Error GoTo errorhandler
  21.     sql = "select * from [sheet3$a2:w" & r & "]"
  22.     Select Case UBound(Split(Node.FullPath, "")) + 1
  23.         Case 1:
  24.             sql = "select * from [sheet3$a2:w" & r & "]"
  25.         Case 2:
  26.             sql = sql & "  where 名称 = '" & Node.Text & "'"

  27.         Case 3:
  28.             sql = sql & "  where 班级 = '" & Node.Text & "'"
  29.         Case 4:
  30.             sql = sql & "  where 姓名 = '" & Node.Text & "'"
  31.     End Select
  32.    
  33.     rst.Open sql, cnn, 3, 1
  34.     If rst.RecordCount = 0 Then MsgBox "未找到记录!", vbInformation, "友情提示": Exit Sub
  35.     With Me.ListView1
  36.         .Sorted = False
  37.         .ListItems.Clear
  38.         For I = 1 To rst.RecordCount
  39.             .ListItems.Add , , rst.Fields(0)
  40.             For j = 1 To rst.Fields.Count - 1
  41.                 .ListItems(I).SubItems(j) = IIf(IsNull(rst.Fields(j)), "", rst.Fields(j))
  42.             Next j
  43.             rst.MoveNext
  44.         Next I
  45.     End With
  46.     rst.Close: Set rst = Nothing
  47.     cnn.Close: Set cnn = Nothing

  48. errorhandler:
  49.     If Err.Number > 0 Then MsgBox Err.Description
  50. End Sub
复制代码
回复

使用道具 举报

发表于 2013-8-21 18:17 | 显示全部楼层    本楼为最佳答案   
  1. Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
  2.     Dim sql$, I%, r%
  3.     Set cnn = CreateObject("ADODB.Connection")
  4.     Set rst = CreateObject("ADODB.Recordset")
  5.     With Sheets("Sheet3")
  6.         r = .Range("a65536").End(xlUp).Row
  7.     End With
  8.     cnn.Open "Provider =Microsoft.Jet.OLEDB.4.0;Extended properties= Excel 8.0;Data source=" & ThisWorkbook.FullName
  9.     With TreeView1
  10.         For I = 1 To .Nodes.Count
  11.             If .Nodes(I).Children = 0 Then
  12.                 If .Nodes(I).Selected Then
  13.                     .Nodes(I).Image = 4
  14.                 Else
  15.                     .Nodes(I).Image = 3
  16.                 End If
  17.             End If
  18.         Next
  19.     End With

  20.     On Error GoTo errorhandler
  21.     sql = "select * from [sheet3$a2:w" & r & "]"
  22.     Select Case UBound(Split(Node.FullPath, "")) + 1
  23.         Case 1:
  24.         Case 2:
  25.             sql = sql & "  where 名称 = '" & Node.Text & "'"
  26.         Case 3:
  27.             sql = sql & "  where 班级 = '" & Node.Text & "'"
  28.         Case 4:
  29.             sql = sql & "  where 姓名 = '" & Node.Text & "'"
  30.     End Select
  31.    
  32.     rst.Open sql, cnn, 3, 1
  33.     If rst.RecordCount = 0 Then MsgBox "未找到记录!", vbInformation, "友情提示": Exit Sub
  34.    
  35.     With Me.ListView1
  36.         .Sorted = False
  37.         .ListItems.Clear
  38.         For I = 1 To rst.RecordCount
  39.             .ListItems.Add , , rst.Fields(0)
  40.             For j = 1 To rst.Fields.Count - 1
  41.                 .ListItems(I).SubItems(j) = IIf(IsNull(rst.Fields(j)), "", rst.Fields(j))
  42.             Next j
  43.             rst.MoveNext
  44.         Next I
  45.     End With
  46.     rst.Close: Set rst = Nothing
  47.     cnn.Close: Set cnn = Nothing
  48.     Exit Sub

  49. errorhandler:
  50.     MsgBox Err.Description
  51. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2013-8-21 19:45 | 显示全部楼层
hwc2ycy 发表于 2013-8-21 18:17

谢谢hwc2ycy师,您用鼠标双击树目录,将数据复制到Listview中,这样也可以。
我意思是用鼠标点树目录,然后拖拽到 Listview中,放开鼠标即可完成数据复制。如附件中用鼠标点树目录中的“我的学校”目录, 然后将光标拖拽到Listview中,即可将“我的学校”所有数据复制到Listview中。只是下一级不知如何改写。谢谢!
(提示:附件中的第一级已经有这种代码了)
回复

使用道具 举报

发表于 2013-8-21 20:33 | 显示全部楼层
拖的话是遍历CHILD和ITEM。
我猜的,
回复

使用道具 举报

 楼主| 发表于 2013-8-21 21:50 | 显示全部楼层
hwc2ycy 发表于 2013-8-21 20:33
拖的话是遍历CHILD和ITEM。
我猜的,

谢谢老师:下面是3级的代码,如何改为4级。谢谢!

Private Sub ListView1_OLEDragDrop(Data As MSComctlLib.DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single)
   Cancel = True
   Effect = 1
   Dim sql$, I%, r%
   Set cnn = CreateObject("ADODB.Connection")
   Set rst = CreateObject("ADODB.Recordset")
   With Sheets("Sheet3")
      r = .Range("a65536").End(xlUp).Row
   End With
   cnn.Open "Provider =Microsoft.Jet.OLEDB.4.0;Extended properties= Excel 8.0;Data source=" & ThisWorkbook.FullName
   With Me.TreeView1
      If .SelectedItem.Children = 0 Then            
         sql = "select * from [sheet3$a2:w" & r & "] where 我的学校 = '" & .SelectedItem.Parent & "' and  姓名 = '" & .SelectedItem.Text & "'" '
         rst.Open sql, cnn, 3, 1
         If rst.RecordCount = 0 Then MsgBox "未找到记录!", vbInformation, "友情提示": Exit Sub
      ElseIf .SelectedItem.Parent Is Nothing Then      
         sql = "select * from [sheet3$a2:w" & r & "]"
         rst.Open sql, cnn, 3, 1
      Else                                             
         sql = "select * from [sheet3$a2:w" & r & "]  where 我的学校 = '" & .SelectedItem.Text & "'"
         rst.Open sql, cnn, 3, 1
      End If
   End With
   With Me.ListView1
      .Sorted = False                                      
      For I = 1 To rst.RecordCount                          
         Set ITM = ListView1.ListItems.Add(, , IIf(IsNull(rst.Fields(0)), "", rst.Fields(0)))
         For j = 1 To rst.Fields.Count - 1
            ITM.SubItems(j) = IIf(IsNull(rst.Fields(j)), "", rst.Fields(j))
            Next
            rst.MoveNext
         Next
      .SelectedItem.Selected = False         
   End With
   rst.Close: Set rst = Nothing
   cnn.Close: Set cnn = Nothing
End Sub
回复

使用道具 举报

发表于 2013-8-21 21:56 | 显示全部楼层
c888 发表于 2013-8-21 21:50
谢谢老师:下面是3级的代码,如何改为4级。谢谢!

Private Sub ListView1_OLEDragDrop(Data As MSComc ...

你这Data参数都没有用到,不算真正意义上的拖拽操作了。
只能说是取得巧。
回复

使用道具 举报

发表于 2013-8-21 21:57 | 显示全部楼层
你把我之前的那个代码稍微改下就能用在这里了。
我那个实现了2,3,4层。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-26 04:31 , Processed in 6.214913 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表