[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
对出现的6进行了修补
数组赋值后遗留的 a b变量分别表示行和列
因为最后两列是排名,我用项目数=b-2表示项目数量,剔除了6

不足之处,表示同意。

[ 本帖最后由 523066680 于 2009-11-20 16:41 编辑 ]

TOP

我也发表一点观点

事实上这道题会遇到的排序问题,根之前讨论的纯数字排序有一点不同
就是你要:给这个项目排序,不管你怎样操作,
          最终都必须为每个数字匹配这个数值的"主人"  并显示出来。

这个问题在表格操作中是经常会遇到的,例如给学生各科成绩排名
此时要排的就不仅仅是数值,还有该分值对应的"主人"   
针对于各列并且要关系到其中一项的行上其他数据时,我认为应该让批处理加入 二维数组 概念

[ 本帖最后由 523066680 于 2009-11-21 10:02 编辑 ]

TOP

&&这个问题的确是我在工作中遇到和解决的,实际上的操作是用批先生成一个temp.vbs,

然后用temp.vbs读取指定工作表的指定分页(sheet*)的指定范围指定单元格的数据,然

后输入到temp.txt(这是用批做不到的),然后用批进行数据统计分析并输出最终想要的结

果。这是个实用性很强的问题,因为考虑难度比较大,所以在出题时省去了读取excel表数

据的步骤,直接给出了temp.txt的内容。所以请工作中与excel表打交道的会员都认真做一下

本题,不做也可以对照前面给出的代码仔细思考一下,说不定以后你就会遇到类似的问题。
***共同提高***

TOP

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set/pt=<in.txt
  4. set t=!t:  = !
  5. set max1=0
  6. set max2=0
  7. for %%i in (%t:~2,-11%) do (
  8.    set/an+=1
  9.    set n!n!=%%i
  10. )
  11. for /f "skip=1 tokens=1* delims= " %%i in (in.txt) do (
  12.    set i=0
  13.    for %%z in (%%j) do (
  14.       set/ai+=1
  15.       if !i! leq %n% (
  16.          for %%y in (!i!) do (
  17.             if %%z==0 (
  18.                for %%x in (w!n%%y!) do (
  19.                   set %%x=!%%x!,%%i
  20.                )
  21.             ) else (
  22.                set/as!n%%y!+=%%z
  23.             )
  24.          )
  25.       ) else (
  26.          if defined p (
  27.             set p=
  28.             set y%%z=!y%%z!,%%i%%z
  29.             if !max2! lss %%z (
  30.                set max2=%%z
  31.             )
  32.          ) else (
  33.             set p=1
  34.             set r%%z=!r%%z!,%%i%%z
  35.             if !max1! lss %%z (
  36.                set max1=%%z
  37.             )
  38.          )
  39.       )
  40.    )
  41. )
  42. for /l %%i in (1,1,%n%) do (
  43.    set o=!n%%i!
  44.    for %%x in (s!n%%i!) do (
  45.       set o=!o!!%%x!,完成为0的局:
  46.       if defined w!n%%i! (
  47.          for %%x in (w!n%%i!) do (
  48.             echo !o!!%%x:~1!
  49.          )
  50.       ) else (
  51.          echo !o!无
  52.       )
  53.    )
  54. )
  55. set o=
  56. for /l %%i in (1,1,%max1%) do (
  57.    set o=!o!!r%%i!
  58. )
  59. echo 当日排名:!o:~1!
  60. set o=
  61. for /l %%i in (1,1,%max2%) do (
  62.    set o=!o!!y%%i!
  63. )
  64. echo 当月累计排名:!o:~1!
  65. pause>nul
复制代码

[ 本帖最后由 Seter 于 2009-11-21 21:42 编辑 ]
1

评分人数

    • batman: 未知行未知列何来%t:~2,-11%PB + 15

TOP

回复 34楼 的帖子

输出时当日排名和当月排名搞反了!
***共同提高***

TOP

回楼上的
修改好了...我发现问题在于用于辨别的变量p被我设定为环境变量了,所以我调试的时候if defined p是通过的,结果我就把对的改错了..

TOP

什么?连标题中的"部门 当天排名 当月累计排名"都是不确定的!?

TOP

还是让合适的工具来做最适合的工作吧,以前我先用bat来处理数据,发现效率太低了,后来又用bat调用vbs处理,感觉没那么顺手,接触到vba后,哈哈,有了相见恨晚的感觉...
我想,可能batman还不知道excel里有一个叫做vba(快捷键为Alt+F8)的东西吧,用VBE(快捷键Alt+F11)编写的,用下面的代码(vba)就高效多了,哈哈...
  1. Option Explicit
  2. Sub JustDoIt()
  3.   Dim AllColumns As Integer, AllRows As Integer, i As Integer, j As Integer, ADuty As Integer, Info As String, _
  4.     Info2 As String
  5.   AllColumns = Range("iv1").End(xlToLeft).Column       '获取数据区列数
  6.   AllRows = Range("a65536").End(xlUp).Row              '获取数据区行数
  7.   For i = 2 To AllColumns - 2
  8.     Info = ""
  9.     ADuty = 0
  10.     For j = 2 To AllRows
  11.       If Cells(j, i) > 0 Then
  12.         ADuty = ADuty + Cells(j, i)
  13.       Else
  14.         Info = Info & Cells(j, 1) & ","
  15.       End If
  16.     Next
  17.     If Info = "" Then Info = "无"
  18.     Cells(i, AllColumns + 1) = Cells(1, i) & ADuty & ", 完成为 0 的局: " & Info
  19.   Next
  20.   Info = "当日排名: "
  21.   Info2 = "当月累计排名: "
  22.   For i = 1 To AllRows
  23.     For j = 2 To AllRows
  24.       If Cells(j, AllColumns - 1) = i Then Info = Info & Cells(j, 1) & i & ","
  25.       If Cells(j, AllColumns) = i Then Info2 = Info2 & Cells(j, 1) & i & ","
  26.     Next
  27.   Next
  28.   Cells(AllColumns, AllColumns + 1) = Info & vbCrLf & Info2
  29.   Columns(AllColumns + 1).AutoFit
  30.   Cells(AllColumns, AllColumns + 1).Select
  31. End Sub
复制代码

TOP

回复 38楼 的帖子

vba我怎么会不知道啊,呵呵,最简单的不是你这样的,而是用excel的函数来解决。
***共同提高***

TOP

函数完成不了1楼要求的显示效果吧,而在33楼你却说实际工作中是用vbs来操作的嘛...还生成一个b.txt...

TOP

回复 40楼 的帖子

vbs可以调用excel,同时还可以让这个excel执行VBA,并调用其中的函数。
所以说vbs是强大滴。
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

返回列表