Excel精英培训网

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

[已解决]分班技术问题

[复制链接]
发表于 2014-2-25 08:26 | 显示全部楼层 |阅读模式
本帖最后由 陈丹青 于 2014-2-25 14:06 编辑

如何根据所赋的值x,按1至x,再x至1用VBA填充
最佳答案
2014-2-25 09:04
  1. Sub 分班()
  2.     Dim mm As Long
  3.     On Error Resume Next

  4.     mm = InputBox("请你输入要分几班:", "班别数目提示息,请输入正整数", "0")
  5.     If mm <= 0 Then
  6.         MsgBox "班别数目不符合要求"
  7.         Exit Sub
  8.     End If
  9.    
  10.     Dim arr, j
  11.     arr = Range("a2:c" & Cells(Rows.Count, 1).End(xlUp).Row).Value
  12.     For i = 1 To UBound(arr) Step mm * 2
  13.         For j = 1 To mm
  14.             arr(i + j - 1, 3) = j
  15.         Next
  16.     Next
  17.     For i = mm + 1 To UBound(arr) Step mm * 2
  18.         For j = 1 To mm
  19.             arr(i + j - 1, 3) = mm - j + 1
  20.         Next
  21.     Next
  22.     Range("a2").Resize(UBound(arr), UBound(arr, 2)).Value = arr
  23.     MsgBox "ok"
  24. End Sub
复制代码

分班问题.rar

10.84 KB, 下载次数: 26

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2014-2-25 09:04 | 显示全部楼层    本楼为最佳答案   
  1. Sub 分班()
  2.     Dim mm As Long
  3.     On Error Resume Next

  4.     mm = InputBox("请你输入要分几班:", "班别数目提示息,请输入正整数", "0")
  5.     If mm <= 0 Then
  6.         MsgBox "班别数目不符合要求"
  7.         Exit Sub
  8.     End If
  9.    
  10.     Dim arr, j
  11.     arr = Range("a2:c" & Cells(Rows.Count, 1).End(xlUp).Row).Value
  12.     For i = 1 To UBound(arr) Step mm * 2
  13.         For j = 1 To mm
  14.             arr(i + j - 1, 3) = j
  15.         Next
  16.     Next
  17.     For i = mm + 1 To UBound(arr) Step mm * 2
  18.         For j = 1 To mm
  19.             arr(i + j - 1, 3) = mm - j + 1
  20.         Next
  21.     Next
  22.     Range("a2").Resize(UBound(arr), UBound(arr, 2)).Value = arr
  23.     MsgBox "ok"
  24. End Sub
复制代码
回复

使用道具 举报

发表于 2014-2-25 09:07 | 显示全部楼层
本帖最后由 a18332652 于 2014-2-25 09:08 编辑

说个思路吧,你可以试试:
1、确定单元格A1,然后确定A列的长度(即需要分班的学生人数),
2、取数X,I=1。X是要分几个个班,
3、使参数A=1,A=A+1,I=I+1,判断 A=X?I=分班总人数?,建立循环
4、当A=X时I<分班总人数时,终止循环跳入 A=A-1,I=I+1,判断 A=1?I=分班总人数?
5、当I=分班的总人数时,跳出所有循环结束程序。
回复

使用道具 举报

发表于 2014-2-25 09:19 | 显示全部楼层
C2单元格公式、下拉。
=IF(MOD(INT((ROW()-2)/8),2)=0,IF(MOD((ROW()-1),8)=1,1,C1+1),IF(MOD((ROW()-1),8)=1,8,C1-1))
回复

使用道具 举报

发表于 2014-2-25 09:24 | 显示全部楼层
  1. Sub 分班()
  2.     Dim mm As Long
  3.     On Error Resume Next

  4.     mm = InputBox("请你输入要分几班:", "班别数目提示息,请输入正整数", "0")
  5.     If mm <= 0 Then
  6.         MsgBox "班别数目不符合要求"
  7.         Exit Sub
  8.     End If

  9.     Dim arr, j As Long
  10.     j = Cells(Rows.Count, 1).End(xlUp).Row
  11.     Range("c2:c" & j).ClearContents
  12.     arr = Range("a2:c" & j).Value
  13.     For I = 1 To UBound(arr) Step mm * 2
  14.         For j = 1 To mm
  15.             arr(I + j - 1, 3) = j
  16.             arr(I + j + mm - 1, 3) = mm - j + 1
  17.         Next
  18.     Next
  19.     Range("a2").Resize(UBound(arr), UBound(arr, 2)).Value = arr
  20.     MsgBox "ok"
  21. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2014-2-25 10:20 | 显示全部楼层
本帖最后由 陈丹青 于 2014-2-25 10:22 编辑

二楼大师实现效果不错,不过,若我想不放C列,放其它列,我试着改了一下,不知怎样修改
回复

使用道具 举报

 楼主| 发表于 2014-2-25 10:26 | 显示全部楼层
Sub 分班()
    Dim mm As Long
    On Error Resume Next

    mm = InputBox("请你输入要分几班:", "班别数目提示息,请输入正整数", "0")
    If mm <= 0 Then
        MsgBox "班别数目不符合要求"
        Exit Sub
    End If

    Dim arr, j As Long
    j = Cells(Rows.Count, 1).End(xlUp).Row '计算A列行数
    Range("c2:c" & j).ClearContents  '清除C列
    arr = Range("a2:c" & j).Value  '选择A至C列的值
    For I = 1 To UBound(arr) Step mm * 2
        For j = 1 To mm
            arr(I + j - 1, 3) = j
            arr(I + j + mm - 1, 3) = mm - j + 1
        Next
    Next
    Range("a2").Resize(UBound(arr), UBound(arr, 2)).Value = arr
    MsgBox "ok"
End Sub

后面的比较难,不怎么懂
回复

使用道具 举报

 楼主| 发表于 2014-2-25 10:59 | 显示全部楼层
请问大师,若我要将数据不放C列,放D列,该怎样修改?
回复

使用道具 举报

 楼主| 发表于 2014-2-25 14:05 | 显示全部楼层
搞定,arr = Range("a2:c" & j).Value中的C往后移,3往后

点评

动手能力不错。  发表于 2014-2-25 16:29
回复

使用道具 举报

 楼主| 发表于 2014-2-25 16:33 | 显示全部楼层
本帖最后由 陈丹青 于 2014-4-29 10:39 编辑

谢谢点评,请多多指教
Sub 定班()          '女先升后降,男先降后升,平均分较为均匀
    Range("i2").Select
    Range("A1:j" & [B65536].End(3).Row).Sort Key1:=Range("B2"), Order1:=xlDescending, Key2:= _
        Range("C2"), Order2:=xlDescending, Header:=xlGuess
        
     Range("D1") = "班"
    Dim mm As Long
    On Error Resume Next
    mm = InputBox("请你输入要分几班:", "班别数目提示息,请输入正整数", "0")
    If mm <= 0 Then
        MsgBox "班别数目不符合要求"
        Exit Sub
    End If
    Dim arr, j, s, a As Long
    j = Range("B:B").Find("女", , , , , xlPrevious).Row ' Cells(Rows.Count, 2).End(xlUp).Row '第二列有数据的行
    Range("D2:D" & [d65536].End(3).Row).ClearContents         'M列到有数据的行内容清除
    arr = Range("a2:D" & j).Value           '选择A2到K最后
    For i = 1 To UBound(arr) Step mm * 2
        For j = 1 To mm
            arr(i + j - 1, 4) = j                 '写到4列
            arr(i + j + mm - 1, 4) = mm - j + 1    '写到4列
            
        Next
    Next
    Range("a2").Resize(UBound(arr), UBound(arr, 2)).Value = arr
   
     a = Application.WorksheetFunction.CountIf(Range("B1:B65536"), "女") + 1
    j = Range("B:B").Find("男", , , , , xlPrevious).Row ' Cells(Rows.Count, 2).End(xlUp).Row '第二列有数据的行
    arr = Range("a2:D" & j).Value           '选择A2到K最后
    For i = a To UBound(arr) Step mm * 2
        For j = 1 To mm
            arr(i + j + mm - 1, 4) = j               '写到4列
            arr(i + j - 1, 4) = mm - j + 1    '写到4列
            
        Next
    Next
    Range("a2").Resize(UBound(arr), UBound(arr, 2)).Value = arr
End Sub
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 19:02 , Processed in 0.359489 second(s), 17 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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