ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] Excel 循环实现方法

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-1-14 20:26 | 显示全部楼层 |阅读模式

Excel 循环

Excel 循环


请教:想现按照"循环开始“列的上下两行的单元格的值进行比较,如果相同,则继续循环输出该循环内的值。循环可以如上表显示的可以嵌套多层。


TA的精华主题

TA的得分主题

发表于 2020-1-14 20:47 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-1-14 20:58 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-1-14 21:12 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

关键是循环嵌套层次不定

TA的精华主题

TA的得分主题

发表于 2020-1-14 21:20 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-1-14 21:23 | 显示全部楼层
本帖最后由 blue_li 于 2020-1-16 21:35 编辑
orr89 发表于 2020-1-14 20:58
循环啥,数据呢

我是想实现无限的循环嵌套,我的代码只实现了一层的循环。
  1. Option Explicit



  2. '进度条函数
  3. Function GetProgress(curValue, maxValue)
  4. Dim i As Single, j As Integer, s As String, m As Single, n As Single

  5. i = maxValue / 20
  6. j = curValue / i

  7. For m = 1 To j
  8.     s = s & "■"
  9. Next m
  10. For n = 1 To 20 - j
  11.     s = s & "□"
  12. Next n
  13. GetProgress = s & FormatNumber(curValue / maxValue * 100, 2) & "%"
  14. End Function

  15. '创建txt文件
  16. Sub CreateCim()
  17.    
  18.     Dim c_row, c_column, maxrow, Maxcolumn, c_start, c_end, c_lnnbr, option_column, option_colend As Long
  19.     Dim strCell() As String
  20.     Dim option_arr() As String
  21.     Dim strString, sLineEnd As String
  22.     Dim CreateText As Object
  23.     Dim SelectSheet As Object
  24.     Dim WorkbookName As String
  25.     Dim WorkSheetName As String
  26.     Dim CurrValue As String
  27.     Dim DataArr() '用于存放单元格数值,提升效率
  28.    
  29.    
  30.     Set SelectSheet = ActiveWorkbook.ActiveSheet
  31.     WorkbookName = Left(ActiveWorkbook.Name, InStrRev(ActiveWorkbook.Name, ".") - 1)
  32.     WorkSheetName = ActiveSheet.Name
  33.     Set CreateText = CreateObject("ADODB.Stream")
  34.             
  35.   On Error GoTo ErrorMessage

  36.     c_row = 1
  37.     Maxcolumn = 0
  38.     Do While SelectSheet.Cells(6, c_row) <> ""
  39.         Maxcolumn = Maxcolumn + 1
  40.         c_row = c_row + 1
  41.     Loop
  42.    
  43.     ReDim strCell(Maxcolumn) As String
  44.    
  45.     If LCase(Panel.LineFeed.Text) = "chui" Then
  46.         sLineEnd = vbLf
  47.     ElseIf LCase(Panel.LineFeed.Text) = "gui" Then
  48.         sLineEnd = vbCrLf
  49.     End If
  50.               
  51.    
  52.     c_start = 0
  53.     c_lnnbr = 0
  54.     c_end = Maxcolumn + 1
  55.    
  56.     For c_column = 1 To Maxcolumn
  57.         If SelectSheet.Cells(7, c_column) = "loop_start" Then
  58.            c_start = c_column
  59.            c_lnnbr = SelectSheet.Cells(8, c_column)
  60.         End If
  61.         If SelectSheet.Cells(7, c_column) = "loop_end" Then
  62.            c_end = c_column
  63.         End If
  64.    
  65.     Next c_column
  66.    
  67.     c_row = CLng(Panel.StartLine.Text)
  68.     maxrow = CLng(Panel.EndLine.Text)
  69.    
  70.    
  71.     '将单元格数据赋于DataArr二维数组
  72.     ReDim DataArr(1 To maxrow + 1, 1 To Maxcolumn + 1)
  73.     DataArr = SelectSheet.Cells(1, 1).Resize(maxrow + 1, Maxcolumn + 1).Value
  74.    
  75.    
  76.     With CreateText
  77.                 .Type = 2
  78.                 .Charset = Panel.CodePage.Text
  79.                 .Open
  80.                
  81.         For c_row = c_row To maxrow
  82.                
  83.                If c_lnnbr = 0 Then
  84.                strString = "@@batchload " & Panel.QadProgram.Text & sLineEnd
  85.             ElseIf LCase(DataArr(c_row, c_lnnbr)) <> LCase(DataArr(c_row - 1, c_lnnbr)) Then
  86.                strString = "@@batchload " & Panel.QadProgram.Text & sLineEnd
  87.             End If
  88.             
  89.             For c_column = 1 To Maxcolumn
  90.                
  91.                 '根据内容判断是否输出“内容判断开始”与“内容判断结束”之间的数据
  92. option_start:
  93.                 If LCase(DataArr(7, c_column)) = "option_start" Then
  94.                     
  95.                     option_column = c_column
  96.                     If DataArr(8, c_column) <> "" Then
  97.                         option_column = DataArr(8, c_column)
  98.                     End If
  99.                     option_arr = Split(LCase(DataArr(10, c_column)), ",")
  100.                     
  101.                     
  102.                     '如果在第10行没有找到该值,则执行跳过。
  103.                     If UBound(VBA.Filter(option_arr, LCase(DataArr(c_row, option_column)))) < 0 Or LCase(DataArr(c_row, option_column)) = "" Then
  104.                                       
  105.                         For option_colend = c_column To Maxcolumn
  106.                                 If LCase(DataArr(7, option_colend)) = "option_end" Then
  107.                                      c_column = option_colend
  108.                                      Exit For
  109.                                 End If
  110.                         Next option_colend
  111.             
  112.                     End If
  113.                 End If
  114.                
  115.                  If LCase(DataArr(7, c_column)) = "option_end" Or LCase(DataArr(7, c_column)) = "option_start" Then
  116.                     If LCase(DataArr(7, c_column + 1)) = "option_start" Then
  117.                         c_column = c_column + 1
  118.                         GoTo option_start
  119.                     End If
  120.                     c_column = c_column + 1
  121.                 End If
  122.                           
  123.                           
  124.                 '判断是否输出".","-"或单元格内容
  125.                 If Trim(Replace(Replace(DataArr(10, c_column), Chr(10), ""), Chr(13), "")) = "." Then
  126.                     CurrValue = "."
  127.                 ElseIf Trim(Replace(Replace(DataArr(c_row, c_column), Chr(10), ""), Chr(13), "")) = "" Or Trim(Replace(Replace(DataArr(c_row, c_column), Chr(10), ""), Chr(13), "")) = "-" Then
  128.                     CurrValue = "-"
  129.                 Else:
  130.                     CurrValue = Replace(Replace(DataArr(c_row, c_column), Chr(10), ""), Chr(13), "")
  131.                 End If
  132.                
  133.                 '清除首尾空格
  134.                 If Panel.trimoption.Value = True And CurrValue <> "." And CurrValue <> "-" And CurrValue <> """""" Then
  135.                     CurrValue = Trim(CurrValue)
  136.                 End If
  137.                
  138.                 '替换"字符为指定字符
  139.                 If Panel.Suboption.Value = True And CurrValue <> "." And CurrValue <> "-" And CurrValue <> """""" Then
  140.                     CurrValue = Replace(CurrValue, Chr(34), Panel.subtext.Value)
  141.                 End If
  142.                
  143.                  '字符前后添加双引号
  144.                 If DataArr(10, c_column) = "chr" And CurrValue <> "." And CurrValue <> "-" And CurrValue <> """""" Then
  145.                     CurrValue = Chr(34) & CurrValue & Chr(34)
  146.                 End If
  147.                
  148.                 '转为日期为指定格式
  149.                 If DataArr(10, c_column) = "dat" And CurrValue <> "." And CurrValue <> "-" And CurrValue <> """""" And CurrValue <> "?" Then
  150.                     CurrValue = convDate2String(CDate(CurrValue))
  151.                 End If

  152.                 '空值指定为""显示
  153.                 If CurrValue = "-" And Panel.Reoption1.Value = True And DataArr(10, c_column) = "chr" Then
  154.                     CurrValue = Chr(34) & Chr(34)
  155.                 End If

  156.                
  157.                 strCell(c_column) = CurrValue
  158.                
  159.                 '如果该列存在"enterline"则输出一个回车键
  160.                 If DataArr(11, c_column) = "enterline" Then
  161.                     strCell(c_column) = strCell(c_column) & sLineEnd
  162.                 Else
  163.                     strCell(c_column) = strCell(c_column) & Chr(9)
  164.                 End If
  165.                
  166.                 If c_lnnbr = 0 Then
  167.                 ElseIf c_column < c_start And LCase(DataArr(c_row, c_lnnbr)) <> LCase(DataArr(c_row - 1, c_lnnbr)) Then
  168.                    strString = strString & strCell(c_column)
  169.                 End If
  170.                
  171.                 If c_column > c_start And c_column < c_end Then
  172.                    strString = strString & strCell(c_column)
  173.                 End If
  174.                 If c_lnnbr = 0 Then
  175.                 ElseIf c_column > c_end And LCase(DataArr(c_row, c_lnnbr)) <> LCase(DataArr(c_row + 1, c_lnnbr)) Then
  176.                    strString = strString & strCell(c_column)
  177.                 ElseIf c_column > c_end And c_row >= maxrow And LCase(DataArr(c_row, c_lnnbr)) = LCase(DataArr(c_row + 1, c_lnnbr)) Then
  178.                   strString = strString & strCell(c_column)
  179.                 End If
  180.             Next c_column
  181.             
  182.             If c_lnnbr = 0 Then
  183.                strString = strString & "@@end" & sLineEnd
  184.                     .WriteText strString
  185.             ElseIf (LCase(DataArr(c_row, c_lnnbr)) <> LCase(DataArr(c_row + 1, c_lnnbr)) Or c_row >= maxrow) Then
  186.                strString = strString & "@@end" & sLineEnd
  187.                     .WriteText strString
  188.             End If
  189.             
  190.             'Application.StatusBar显示进度,但严重影响性能,弃用
  191.              'Application.StatusBar = c_row - Panel.StartLine.Text & " of the processing record! "
  192.             
  193.              'Panel.Messagetext.Caption = "Please wait!   [  " & c_row - Panel.StartLine.Text & "  ] of the processing record!" & vbCrLf & "Selected [ " & WorkbookName & " ][ " & WorkSheetName & " ]"
  194.              Panel.progress.Caption = GetProgress(c_row - Panel.StartLine.Text + 1, maxrow - Panel.StartLine.Text + 1)
  195.             'Application.StatusBar = GetProgress(c_row - Panel.StartLine.Text + 1, maxrow - Panel.StartLine.Text + 1)
  196.             '响应取消,返回界面窗体
  197.              If Panel.CreateFile.Enabled = True Then
  198.                 Panel.Messagetext.Caption = "Running process has been cancelled."
  199.              Exit Sub
  200.              End If
  201.             
  202.              DoEvents
  203.             
  204.         Next c_row
  205.         
  206.         .SaveToFile Panel.Pathtext.Text & Panel.Nametext.Text, 2

  207.    
  208.     End With
  209.         
  210.     Set CreateText = Nothing
  211.     Set SelectSheet = Nothing
  212.     Panel.Messagetext.ForeColor = &H0&
  213.     Panel.Messagetext.Caption = "Created successfully! Save in " + Panel.Pathtext.Text & Panel.Nametext.Text & " ."
  214.     Exit Sub
  215. ErrorMessage:
  216.     Panel.Messagetext.ForeColor = &HFF&
  217.     Panel.Messagetext.Caption = "Created failed!Please check the data in Column " & c_column & " Row " & c_row & " ."
  218.     SelectSheet.Cells(c_row, c_column).Select
  219.     Set CreateText = Nothing
  220.     Set SelectSheet = Nothing
  221.     Call LoadPane.InterfaceEnabledToTrue
  222.       
  223. End Sub

复制代码


XG.07.09.15销售订单发货.rar

38.66 KB, 下载次数: 1

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

本版积分规则

关闭

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

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

GMT+8, 2024-4-25 17:14 , Processed in 0.038778 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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