ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 一指禅62

[推荐] Listview 的运用

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-2-19 17:50 | 显示全部楼层
本帖已被收录到知识树中,索引项:控件
动态生成相应控件

  1. Private Sub ControlAdd(ByVal Index As Integer, ByVal Name As String)
  2.     Rem  第 Index 组标签+文字框/列表框
  3.     Dim L, T, Ctl As Control
  4.     L = 12 + ((Index - 1) Mod 3) * 240
  5.     T = 12 + (Int((Index - 1) / 3)) * 24
  6.     Rem 添加标签
  7.     With Me.Frame1.Controls.Add("Forms.Label.1", "xLbl" & Index, True)
  8.         .Move L, T + 3, 48, 18
  9.         .Caption = Name & ":"
  10.     End With
  11.     Rem 添加文本框或复合框
  12.     If d.Exists(Name) Then
  13.         Dim a(), n%, ii%, jj%
  14.         jj = d.Item(Name)
  15.         For ii = 2 To UBound(mc)
  16.             If Trim(mc(ii, jj)) = "" Then Exit For
  17.             n = n + 1: ReDim Preserve a(1, n)
  18.             a(1, n) = Trim(mc(ii, jj))
  19.         Next
  20.         Set Ctl = Me.Frame1.Controls.Add("Forms.ComboBox.1", "Text" & Index, True)
  21.         Ctl.List = WorksheetFunction.Transpose(a)
  22.         Ctl.ShowDropButtonWhen = fmShowDropButtonWhenFocus
  23.     Else
  24.         Set Ctl = Me.Frame1.Controls.Add("Forms.TextBox.1", "Text" & Index, True)
  25.     End If
  26.     Ctl.Move L + 57, T, 132, 18
  27.     Ctl.BorderStyle = 1
  28.     Ctl.BorderColor = &H80000002
  29.     Ctl.ForeColor = &HC00000
  30.     Rem  加入集合
  31.     Col.Add Index
  32. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2022-2-20 15:06 | 显示全部楼层
一指禅62 发表于 2022-2-19 17:50
动态生成相应控件

谢谢老师!

TA的精华主题

TA的得分主题

发表于 2022-3-13 23:55 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
一指禅62 发表于 2022-2-19 17:45
全部设计完成。用动态生成控件的方式,极大简化了代码。
  1. Option Explicit
  2. Option Base 1

  3. Private WithEvents xLbl As MSForms.Label
  4. Private WithEvents txtBox As MSForms.TextBox
  5. Private WithEvents comBox As MSForms.ComboBox
  6. Private Col As New Collection

  7. Dim mc, d As Object '基础设置表的自定义名称
  8. Dim i As Long, j%, x%
  9. Dim SelItem As MSComctlLib.ListItem
  10. Dim SelRow As Long  '数据库工作表的当前行

  11. Private Sub UserForm_Initialize()
  12.     自定义名称管理
  13.     With ListView1
  14.         .FullRowSelect = True  '选择整行
  15.         .Gridlines = True      '显示格线
  16.         .LabelEdit = lvwManual '标签不可修改
  17.         'Set .SmallIcons = ImageList1 '借助ImageList控件图片调整行高
  18.         .View = lvwReport      '列表型
  19.         .HideColumnHeaders = False '不隐藏列头
  20.     End With
  21.     MultiPage1.Value = 0 '指向基础页
  22.     Call MultiPage1_Change
  23. End Sub

  24. Private Sub 自定义名称管理()
  25.     mc = Sheet2.Range("A1").CurrentRegion.Value
  26.     Set d = CreateObject("Scripting.Dictionary")
  27.     For j = 1 To UBound(mc, 2)
  28.         d(mc(1, j)) = j     '名称及其列号
  29.     Next
  30. End Sub

  31. Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem)
  32.     Me.Controls("Text1").Text = Item
  33.     For i = 2 To Col.Count
  34.         Me.Controls("Text" & i).Text = Item.SubItems(i - 1)
  35.     Next
  36.     cmd保存.Enabled = False
  37.     cmd修改.Enabled = True
  38.     cmd删除.Enabled = True
  39. End Sub

  40. Private Sub MultiPage1_Change()
  41.     Rem 功能:关联对应工作表
  42.     On Error GoTo Err1 '处理工作表不存在的错误
  43.     Rem  清除列表数据
  44.     ListView1.ColumnHeaders.Clear
  45.     ListView1.ListItems.Clear
  46.     Rem  获取相应记录
  47.     xName = MultiPage1.SelectedItem.Caption         '页标签
  48.     Set Sh = Sheets(xName)                          '工作表
  49.     Database = Sh.Range("A1").CurrentRegion.Value   '数据记录
  50.     Frame1.Caption = "  " & xName & "  "
  51.     If UBound(Database) = 0 Then
  52.         MsgBox "“" & xName & "表”没有任何数据!", vbCritical, "提示"
  53.         Exit Sub
  54.     End If
  55.     Rem  移除旧有的控件
  56.     If Col.Count > 0 Then
  57.         For i = Col.Count To 1 Step -1
  58.             Me.Frame1.Controls.Remove "Text" & i
  59.             Me.Frame1.Controls.Remove "xLbl" & i
  60.         Next
  61.         Set Col = Nothing
  62.     End If
  63.    
  64.     Rem  加载列表头,添加控件
  65.     For j = 1 To UBound(Database, 2)
  66.         ListView1.ColumnHeaders.Add , , Database(1, j)
  67.         Call ControlAdd(j, Database(1, j))
  68.     Next
  69.     Frame1.ScrollHeight = (Int((Col.Count - 1) / 3)) * 36
  70.     Me.Controls("Text1").Enabled = False
  71.     Call cmd模糊查询_Click
  72.     Call cmd新建_Click
  73.     Exit Sub
  74. Err1:
  75.     MsgBox Err.Description, vbExclamation, "错误"
  76.     Err.Clear
  77. End Sub

  78. Private Sub ControlAdd(ByVal Index As Integer, ByVal Name As String)    '第 Index 组标签+文字框/列表框
  79.     Dim L, T, Ctl As Control
  80.     L = 12 + ((Index - 1) Mod 3) * 240
  81.     T = 12 + (Int((Index - 1) / 3)) * 24
  82.     Rem 添加标签
  83.     With Me.Frame1.Controls.Add("Forms.Label.1", "xLbl" & Index, True)
  84.         .Move L, T + 3, 48, 18
  85.         .Caption = Name & ":"
  86.     End With
  87.     Rem 添加文本框或复合框
  88.     If d.Exists(Name) Then
  89.         Dim a(), n%, ii%, jj%
  90.         jj = d.Item(Name)
  91.         For ii = 2 To UBound(mc)
  92.             If Trim(mc(ii, jj)) = "" Then Exit For
  93.             n = n + 1: ReDim Preserve a(1, n)
  94.             a(1, n) = Trim(mc(ii, jj))
  95.         Next
  96.         Set Ctl = Me.Frame1.Controls.Add("Forms.ComboBox.1", "Text" & Index, True)
  97.         Ctl.List = WorksheetFunction.Transpose(a)
  98.         Ctl.ShowDropButtonWhen = fmShowDropButtonWhenFocus
  99.     Else
  100.         Set Ctl = Me.Frame1.Controls.Add("Forms.TextBox.1", "Text" & Index, True)
  101.     End If
  102.     Ctl.Move L + 57, T, 132, 18
  103.     Ctl.BorderStyle = 1
  104.     Ctl.BorderColor = &H80000002
  105.     Ctl.ForeColor = &HC00000
  106.     Rem  加入集合
  107.     Col.Add Index
  108. End Sub

  109. Private Sub 保存记录并显示明细(ByVal myRow As Long)
  110.     If Trim(Me.Controls("Text2").Text) = "" Then
  111.         MsgBox "姓名不得为空!", vbExclamation, "提示"
  112.         Me.Controls("Text2").SetFocus
  113.         Exit Sub
  114.     End If
  115.     ReDim a(1, Col.Count)
  116.     For i = 1 To Col.Count
  117.         a(1, i) = Trim(Me.Controls("Text" & i).Text)
  118.     Next
  119.     Sheets(xName).Range("A" & myRow).Resize(1, Col.Count) = a
  120.     Call cmd新建_Click
  121.     txtFind.Text = ""
  122.     Call cmd模糊查询_Click
  123. End Sub

  124. Private Sub cmd新建_Click()
  125.     For i = 1 To Col.Count
  126.         Me.Controls("Text" & i).Text = ""
  127.     Next
  128.     Me.Controls("Text1").Text = WorksheetFunction.Max(Sheets(xName).Range("A:A")) + 1
  129.     cmd保存.Enabled = True
  130.     cmd修改.Enabled = False
  131.     cmd删除.Enabled = False
  132. End Sub

  133. Private Sub cmd保存_Click()
  134.     i = Sheets(xName).Range("A65536").End(3).Row + 1
  135.     Call 保存记录并显示明细(i)
  136. End Sub

  137. Private Sub cmd修改_Click()
  138.     i = ListView1.SelectedItem.Tag
  139.     If i < 2 Then Exit Sub
  140.     If MsgBox("您正准备修改 1 条记录。" & vbCrLf & vbCrLf & _
  141.               "如果单击“是”,将无法撤消修改操作。" & vbCrLf & _
  142.               "确实要修改这条记录吗?", vbQuestion + vbYesNo, "修改记录") = vbYes Then
  143.         Call 保存记录并显示明细(i)
  144.     End If
  145. End Sub

  146. Private Sub cmd删除_Click()
  147.     i = ListView1.SelectedItem.Tag
  148.     If i < 2 Then Exit Sub
  149.     If MsgBox("您正准备删除 1 条记录。" & vbCrLf & vbCrLf & _
  150.               "如果单击“是”,将无法撤消删除操作。" & vbCrLf & _
  151.               "确实要删除这条记录吗?", vbQuestion + vbYesNo, "删除记录") = vbYes Then
  152.         Sheets(xName).Rows(i).Delete Shift:=xlUp
  153.         cmd模糊查询_Click
  154.     End If
  155. End Sub

  156. Private Sub cmd清空列表_Click()
  157.    Label5.Caption = ""
  158.    ListView1.ListItems.Clear
  159.    txtFind = ""
  160. End Sub

  161. Private Sub txtFind_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  162.    If KeyCode = 13 Then Call cmd模糊查询_Click
  163. End Sub

  164. Private Sub cmd模糊查询_Click()
  165.     Dim Item As MSComctlLib.ListItem
  166.     ListView1.ListItems.Clear
  167.     Database = Sh.Range("A1").CurrentRegion.Value   '数据记录
  168.     If UBound(Database) < 2 Then GoTo Err1
  169.     For i = 2 To UBound(Database)
  170.         For j = 1 To UBound(Database, 2)
  171.             If UCase(Database(i, j)) Like "*" & UCase(txtFind) & "*" Then
  172.                 Set Item = ListView1.ListItems.Add()
  173.                 Item.Tag = i
  174.                 Item.Text = Database(i, 1)
  175.                 For x = 2 To UBound(Database, 2)
  176.                     Item.SubItems(x - 1) = Database(i, x)
  177.                 Next
  178.                 Exit For
  179.             End If
  180.         Next
  181.     Next
  182. Err1:
  183.     Label5.Caption = IIf(UBound(Database) - 1 = 0, "", "在 " & UBound(Database) - 1 & " 条记录中找到 " & ListView1.ListItems.Count & " 个。")
  184.     cmd保存.Enabled = True
  185.     cmd修改.Enabled = False
  186.     cmd删除.Enabled = False
  187. End Sub
复制代码



QQ截图20220313235006.jpg


老师刚刚看了这个窗体很人性化可以自定义,这个表头我想下移2行,代码是修改那个位置的代码,谢谢

TA的精华主题

TA的得分主题

发表于 2022-3-14 01:34 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
一指禅62 发表于 2022-2-19 17:45
全部设计完成。用动态生成控件的方式,极大简化了代码。

厉害了,我的大神还能动态

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-3-14 08:25 | 显示全部楼层
shenzhenyang 发表于 2022-3-13 23:55
老师刚刚看了这个窗体很人性化可以自定义,这个表头我想下移2行,代码是修改那个位置的代码 ...

最直接的方式是修改数据源

Database = Sh.Range("A1").CurrentRegion.Value   '数据记录

TA的精华主题

TA的得分主题

发表于 2022-3-14 10:58 | 显示全部楼层
一指禅62 发表于 2022-3-14 08:25
最直接的方式是修改数据源

Database = Sh.Range("A1").CurrentRegion.Value   '数据记录


QQ浏览器截图20220314105552.png

Database = Sh.Range("A3").CurrentRegion.Value   '数据记录
这里改成A3 还是不行,

TA的精华主题

TA的得分主题

发表于 2023-4-26 19:52 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
一指禅62 发表于 2022-3-14 08:25
最直接的方式是修改数据源

Database = Sh.Range("A1").CurrentRegion.Value   '数据记录

请问一指禅62老师:
日期从工作表中提取到窗体中时候变成日期+星期
例如:
在工作表中
2023-4-26
到窗体中变成
2023-4-26 星期三
如何避免
谢谢!

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-4-26 20:11 | 显示全部楼层
李桥贵 发表于 2023-4-26 19:52
请问一指禅62老师:
日期从工作表中提取到窗体中时候变成日期+星期
例如:

以前我好像探讨过这个问题,按这个方法您试试看。


第一步:

1.PNG


第二步:
2.PNG


评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-4-26 21:43 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 李桥贵 于 2023-4-26 21:51 编辑
一指禅62 发表于 2023-4-26 20:11
以前我好像探讨过这个问题,按这个方法您试试看。

老师按您说的已经解决了问题,谢谢您老师!

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-4-26 21:57 | 显示全部楼层
李桥贵 发表于 2023-4-26 21:43
老师按您说的已经解决了问题,谢谢您老师!

我最早是发现在SQL中,长日期是文本格式,导致SQL语句出问题。所以记住它了。

评分

1

查看全部评分

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

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-20 13:30 , Processed in 0.041127 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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