ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 见证成长历程---我的答疑解难代码汇总

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-19 17:01 | 显示全部楼层
  1. 代码放模块里,按钮在“合格名单”工作表:
  2. Sub lsc()
  3.     Set d = CreateObject("scripting.dictionary")
  4.     For Each sht In Sheets
  5.          If sht.Name <> ActiveSheet.Name Then
  6.               With sht
  7.                    arr = .UsedRange
  8.                    For i = 3 To UBound(arr)
  9.                         For j = 2 To UBound(arr, 2)
  10.                              If arr(i, j) = "√" Then
  11.                                  d(arr(i, 1)) = d(arr(i, 1)) + 1
  12.                              End If
  13.                         Next
  14.                     Next
  15.              End With
  16.          End If
  17.     Next
  18.     t = d.keys
  19.     ReDim brr(1 To UBound(t), 1 To 1)
  20.     For i = 0 To UBound(t)
  21.         If d(t(i)) >= 2 Then
  22.             m = m + 1
  23.             brr(m, 1) = t(i)
  24.         End If
  25.     Next
  26.     [b3:b1000].ClearContents
  27.     [b3].Resize(UBound(brr)) = brr
  28. End Sub
复制代码

来个比较难的给高手练练手
http://club.excelhome.net/thread-1335007-1-1.html
(出处: ExcelHome技术论坛)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-20 16:55 | 显示全部楼层
本帖最后由 lsc900707 于 2017-3-20 23:47 编辑

加入excelhome大家庭1周年纪念:

积分:5648

主题:17

鲜花:978


没有豪言壮语,只有实际行动。勿忘初心,继续前进!


评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-20 21:38 | 显示全部楼层
本帖最后由 lsc900707 于 2017-3-20 21:40 编辑

根据某列拆分成一个个xls文件,并统计
http://club.excelhome.net/thread-1335252-1-1.html
(出处: ExcelHome技术论坛)

这是拆分成工作表的,拆分不新鲜,主要是统计多列的平均值和求和:
Private Sub CommandButton1_Click()
    Dim tim1 As Date, tim2 As Date: tim1 = Timer
    Dim arr, d As Object, sht As Worksheet
    Set d = CreateObject("scripting.dictionary")
    arr = [a1].CurrentRegion
    For i = 1 To UBound(arr)
        If Not d.exists(arr(i, 1)) Then
            Set d(arr(i, 1)) = Range("a" & i).Resize(1, 5)
        Else
            Set d(arr(i, 1)) = Union(d(arr(i, 1)), Range("a" & i).Resize(1, 5))
        End If
    Next
    x = d.keys
    For k = 1 To UBound(x)
        Set sht = ActiveWorkbook.Sheets.Add(, after:=ActiveSheet)
        sht.Name = x(k)
        d.items()(k).Copy sht.Range("a" & 2)
        Rows("1:1").Copy sht.[a1]
    Next
    For Each sht In Sheets
        If sht.Name <> "Sheet1" Then
           With sht
              k = .Cells(.Rows.Count, 1).End(xlUp).Row
              arr = .[a1].CurrentRegion
              For i = 2 To UBound(arr)
                  For j = 3 To UBound(arr, 2)
                     If IsNumeric(.Cells(i, j)) Then
                         .Cells(k + 1, 1) = "平均": .Cells(k + 2, 1) = "合计"
                         .Cells(k + 1, j) = Application.Average(Application.Index(arr, , j))
                         .Cells(k + 2, j) = Application.Sum(Cells(i, j).Resize(i - 1, 1))
                     End If
                  Next
              Next
            End With
        End If
    Next
    tim2 = Timer
    MsgBox Format(tim2 - tim1, "拆分完成,共耗时:0.00秒"), 64, "时间统计"
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-20 21:41 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 lsc900707 于 2017-3-20 21:42 编辑
  1. <div class="blockcode"><blockquote>这是另存工作簿的,能保持列宽不变:
  2. Private Sub CommandButton1_Click()
  3.     Set rng = Range("a1:e1")
  4.     Application.ScreenUpdating = False
  5.     arr = Range("a1:e" & Range("a65536").End(xlUp).Row)
  6.     Set d = CreateObject("scripting.dictionary")
  7.     For i = 2 To UBound(arr)
  8.          If Not d.exists(arr(i, 1)) Then
  9.                 Set d(arr(i, 1)) = Cells(i, 1).Resize(1, 5)
  10.             Else
  11.                 Set d(arr(i, 1)) = Union(d(arr(i, 1)), Cells(i, 1).Resize(1, 5))
  12.          End If
  13.     Next
  14.     k = d.keys: t = d.items
  15.     For x = 0 To d.Count - 1
  16.         Set wb = Workbooks.Add(xlWBATWorksheet)
  17.         With wb.Sheets(1)
  18.             rng.Copy .[a1]: t(x).Copy .[A2]
  19.             arr = .[a1].CurrentRegion
  20.             n = .Cells(65536, 1).End(xlUp).Row
  21.             For m = 3 To UBound(arr, 2)
  22.                 If IsNumeric(.Cells(n, m)) Then
  23.                     .Cells(n + 1, 1) = "平均": .Cells(n + 2, 1) = "合计"
  24.                     .Cells(n + 1, m) = Application.Average(Application.Index(arr, , m))
  25.                     .Cells(n + 2, m) = Application.Sum(Cells(n, m).Resize(n - 1, 1))
  26.                     .Columns(m).ColumnWidth = ThisWorkbook.ActiveSheet.Columns(m).ColumnWidth
  27.                 End If
  28.             Next
  29.         End With
  30.         wb.SaveAs Filename:=ThisWorkbook.Path & "" & k(x), FileFormat:=xlExcel8
  31.         wb.Close
  32.     Next
  33.     Application.ScreenUpdating = True
  34.     Set rng = Nothing: Set wb = Nothing
  35.     MsgBox "完毕"
  36. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-20 22:03 | 显示全部楼层
按条件删除指定列中对应的内容
http://club.excelhome.net/thread-1335248-1-1.html
(出处: ExcelHome技术论坛)
  1. Sub lsc()
  2.     For i = 2 To ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
  3.         If Cells(i, 7) Like "实习*" Or Cells(i, 8) Like "新聘*" Then
  4.             Cells(i, 2) = ""
  5.         End If
  6.     Next
  7. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-22 23:46 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 lsc900707 于 2017-3-22 23:51 编辑

循环求C列值不为空,就复制改行到"打印损耗表"
http://club.excelhome.net/thread-1335721-1-1.html
(出处: ExcelHome技术论坛)
  1. Sub 复制打印损耗表不为空数据()
  2.    [a1:m4].Copy Sheets("打印损耗表").[a1]
  3.    r = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row - 1
  4.    arr = Range("a5:m" & r)
  5.    ReDim brr(1 To 10000, 1 To 12)
  6.    For i = 1 To UBound(arr)
  7.        If arr(i, 3) <> "0" And arr(i, 3) <> "" Then
  8.            m = m + 1
  9.            For j = 1 To 12
  10.                brr(m, j) = arr(i, j)
  11.            Next
  12.        End If
  13.    Next
  14.    With Sheets("打印损耗表")
  15.       .[a5].Resize(m, 12) = brr
  16.       .Columns("A:N").ColumnWidth = 6
  17.    End With
  18. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-23 00:34 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
帮忙修改一下代码,改成可以合并子文件夹里的所有工作簿
http://club.excelhome.net/thread-1335341-1-1.html
(出处: ExcelHome技术论坛)
  1. Sub lsc()
  2.     Dim tim1 As Date, tim2 As Date: tim1 = Timer
  3.     Dim mypath, myfile, m, j, wb, arr()
  4.     Application.ScreenUpdating = False
  5.     Sheet1.UsedRange.Offset(1, 0).ClearContents
  6.     mypath = ThisWorkbook.Path & "\数据"
  7.     myfile = Dir(mypath, vbDirectory)
  8.     Do While myfile <> ""
  9.         If myfile <> "." And myfile <> ".." Then
  10.             If (GetAttr(mypath & myfile) And vbDirectory) = vbDirectory Then
  11.                 m = m + 1
  12.                 ReDim Preserve arr(m)
  13.                 arr(m) = mypath & myfile & ""
  14.             End If
  15.         End If
  16.         myfile = Dir
  17.     Loop
  18.     For j = 1 To m
  19.         myfile = Dir(arr(j) & "*.xls*")
  20.         While myfile <> ""
  21.             Set wb = CreateObject(arr(j) & myfile)
  22.             With CreateObject(arr(j) & myfile)
  23.             k = .Sheets(1).UsedRange.Rows.Count + 3
  24.                 a = .Sheets(1).Range("A5:G" & k)
  25.                 s = Split(myfile, ".")(0)
  26.                 .Close False
  27.             End With
  28.             With Sheet1
  29.                 .Range("A" & [b65536].End(3).Row + 1).Resize(UBound(a), UBound(a, 2)) = a
  30.                 .Range("H" & .[h65536].End(3).Row + 1).Resize(UBound(a)) = s
  31.             End With
  32.             myfile = Dir()
  33.         Wend
  34.     Next
  35.     Set wb = Nothing
  36.     Application.ScreenUpdating = True
  37.     tim2 = Timer
  38.     MsgBox Format(tim2 - tim1, "合并完成,耗时:0.00秒"), 64, "温馨提示"
  39. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-23 00:34 | 显示全部楼层
本帖最后由 lsc900707 于 2017-3-23 00:36 编辑

楼上的代码怎么又少了两个斜杠,干脆这样贴代码好了:
Sub lsc()
    Dim tim1 As Date, tim2 As Date: tim1 = Timer
    Dim mypath, myfile, m, j, wb, arr()
    Application.ScreenUpdating = False
    Sheet1.UsedRange.Offset(1, 0).ClearContents
    mypath = ThisWorkbook.Path & "\数据\"
    myfile = Dir(mypath, vbDirectory)
    Do While myfile <> ""
        If myfile <> "." And myfile <> ".." Then
            If (GetAttr(mypath & myfile) And vbDirectory) = vbDirectory Then
                m = m + 1
                ReDim Preserve arr(m)
                arr(m) = mypath & myfile & "\"
            End If
        End If
        myfile = Dir
    Loop
    For j = 1 To m
        myfile = Dir(arr(j) & "*.xls*")
        While myfile <> ""
            Set wb = CreateObject(arr(j) & myfile)
            With CreateObject(arr(j) & myfile)
            k = .Sheets(1).UsedRange.Rows.Count + 3
                a = .Sheets(1).Range("A5:G" & k)
                s = Split(myfile, ".")(0)
                .Close False
            End With
            With Sheet1
                .Range("A" & [b65536].End(3).Row + 1).Resize(UBound(a), UBound(a, 2)) = a
                .Range("H" & .[h65536].End(3).Row + 1).Resize(UBound(a)) = s
            End With
            myfile = Dir()
        Wend
    Next
    Set wb = Nothing
    Application.ScreenUpdating = True
    tim2 = Timer
    MsgBox Format(tim2 - tim1, "合并完成,耗时:0.00秒"), 64, "温馨提示"
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-26 15:07 | 显示全部楼层
本帖最后由 lsc900707 于 2017-3-26 15:10 编辑
  1. Sub 提取农行记录()
  2.     Dim brr(1 To 2000, 1 To 5)
  3.     For Each sht In Worksheets(Array("一店", "二店"))
  4.        arr = sht.[a1].CurrentRegion
  5.        For i = 2 To UBound(arr)
  6.            If arr(i, 4) = "农行" Then
  7.                 n = n + 1
  8.                 For j = 1 To UBound(arr, 2)
  9.                     brr(n, j) = arr(i, j)
  10.                 Next
  11.             End If
  12.         Next
  13.     Next
  14.     If n = 0 Then
  15.         MsgBox "没有找到有关信息。"
  16.     Else
  17.         With Sheets("农行记录")
  18.             .Columns("B:C").NumberFormatLocal = "@"
  19.             .[a2].Resize(n, UBound(arr, 2)) = brr
  20.         End With
  21.     End If
  22. End Sub
  23. Sub 提取工行记录()
  24.     Dim brr(1 To 2000, 1 To 5)
  25.     For Each sht In Worksheets(Array("一店", "二店"))
  26.        arr = sht.[a1].CurrentRegion
  27.        For i = 2 To UBound(arr)
  28.            If arr(i, 4) = "工行" Then
  29.                 n = n + 1
  30.                 For j = 1 To UBound(arr, 2)
  31.                     brr(n, j) = arr(i, j)
  32.                 Next
  33.             End If
  34.         Next
  35.     Next
  36.     If n = 0 Then
  37.         MsgBox "没有找到有关信息。"
  38.     Else
  39.         With Sheets("工行记录")
  40.             .Columns("B:C").NumberFormatLocal = "@"
  41.             .[a2].Resize(n, UBound(arr, 2)) = brr
  42.         End With
  43.     End If
  44. End Sub
  45. Sub 提取现金记录()
  46.     Dim brr(1 To 2000, 1 To 5)
  47.     For Each sht In Worksheets(Array("一店", "二店"))
  48.        arr = sht.[a1].CurrentRegion
  49.        For i = 2 To UBound(arr)
  50.            If arr(i, 4) = "现金" Then
  51.                 n = n + 1
  52.                 For j = 1 To UBound(arr, 2)
  53.                     brr(n, j) = arr(i, j)
  54.                 Next
  55.             End If
  56.         Next
  57.     Next
  58.     If n = 0 Then
  59.         MsgBox "没有找到有关信息。"
  60.     Else
  61.         With Sheets("现金记录")
  62.             .Columns("B:C").NumberFormatLocal = "@"
  63.             .[a2].Resize(n, UBound(arr, 2)) = brr
  64.         End With
  65.     End If
  66. End Sub
复制代码

为按钮求代码
http://club.excelhome.net/thread-1336366-1-1.html
(出处: ExcelHome技术论坛)

Sub 提取农行记录()
    Dim brr(1 To 2000, 1 To 5)
    For Each sht In Worksheets(Array("一店", "二店"))
       arr = sht.[a1].CurrentRegion
       For i = 2 To UBound(arr)
           If arr(i, 4) = "农行" Then
                n = n + 1
                For j = 1 To UBound(arr, 2)
                    brr(n, j) = arr(i, j)
                Next
            End If
        Next
    Next
    If n = 0 Then
        MsgBox "没有找到有关信息。"
    Else
        With Sheets("农行记录")
            .Columns("B:C").NumberFormatLocal = "@"
            .[a2].Resize(n, UBound(arr, 2)) = brr
        End With
    End If
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-26 20:00 | 显示全部楼层
本帖最后由 lsc900707 于 2017-3-26 21:19 编辑

提取文件夹下面,每个工作簿指定列的内容。
http://club.excelhome.net/thread-1336349-1-1.html
(出处: ExcelHome技术论坛)
Sub lsc()
t = Timer
myPath = ThisWorkbook.Path & "\"
MyName = Dir(myPath & "*.xls")
Application.ScreenUpdating = False
ReDim brr(1 To 30000, 1 To 3)
Do While MyName <> ""
    If MyName <> ThisWorkbook.Name Then
        n = n + 1
        Set sh = GetObject(myPath & MyName).Sheets(1)
        Arr = sh.[A3].CurrentRegion
        Workbooks(MyName).Close False
        For i = 1 To UBound(Arr)
            m = m + 1
            brr(m, 1) = Arr(i, 15): brr(m, 2) = Arr(i, 16): brr(m, 3) = Arr(i, 17)
        Next
    End If
    MyName = Dir
Loop
Set sh = Nothing
With Sheet1
     .Rows("1:30000").ClearContents
     .Columns(1).NumberFormatLocal = "@"
     .[A1].Resize(m, 3).Value = brr
End With
Application.ScreenUpdating = True
MsgBox "汇总完成!汇总了:" & n & "个工作表;共有:" & m & "行数据。" & vbCr & "用时:" & Format(Timer - t, "0.00") & "秒", vbInformation
End Sub
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-19 02:37 , Processed in 0.045630 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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