Excel / VBA – 在abritrary col / row基础上创build下面的行

我正在制作一个Excel表格来跟踪课程及其参与者。

格式是这样的:

01. Place | Time | Date | Slots 02. SO.com Now Now 5 03. SE.com Soon Soon 10 

等等。

这个清单一次发送给我10到50门课程,我想跟踪每个课程的参与者在同一个文件中。

所以理想情况下,我想运行一个macros,在SO.com的过程中,创build5个(见插槽)新行,然后用= COUNTBLANKreplace刚刚创build的范围的值5,以便“现在插槽“值将显示有多less空闲插槽,而不是插槽的总数。 奖金点,如果任何人都可以指出我如何可以使macros组创build的select以及。

macros应循环遍历整个工作表,并为每个课程做相同的操作。

结果应该是这样的:

 01. Place | Time | Date | Slots 02. SO.com Now Now 5 03. <empty> 04. <empty> 05. <empty> 06. <empty> 07. <empty> 08. SE.com Soon Soon 10 09. <empty> 10. <empty> ... 

在Excel字段中input参与者是通过copypasta完成的,因为我有一个从不同程序批量导出这些信息的系统。

我在VBA上很新,但下面是我开始构build这个代码的初始尝试。 我从networking的其他部分删减了一些代码,对MSDN进行了一些查询,然后猜测其余部分,并不令人意外,它还没有完全正常工作。 我在“Set cellCount = Worksheets […]”开始的行上得到一个对象所需的错误,我不明白为什么。

在这个过程的其他部分的任何input(例如,如果你看到我的代码死了,不pipe对象错误,例如)也是赞赏。


 Sub insertRowsCourseSpace() Dim i& Dim cellCount As Integer Dim a As Integer 'Locate the column to look for course space values Dim col_n As Long For f = 1 To NumCols If Cells(2, f).Value = "Slots" Then col_n = f 'Finding the cell with the given string sets the column number Next 'If cell value is numerical, create rows equal to value For i = 1 To NumRows If IsNumeric(Worksheets(1).Range(col_n & i).Value) = True Then Set cellCount = Worksheets(1).Range(col_n & i).Value Set Worksheets(1).Range(col_n & i).Value = "=COUNTBLANK(ActiveCell.Offset(1):ActiveCell(Offset(1 + cellCount))" For j = 1 To cellCount ActiveCell.Offset(j).EntireRow.Insert Next j Next i End Sub 

编辑:

好,新的尝试:

使用此工作簿: http : //s000.tinyupload.com/? file_id= 02770147469124312893

 Sub insertRowsCourseSlots() Dim i& Dim cellCount As Integer Dim cellValue As Integer Dim a As String Dim b As String 'Locate correct column to look for course slots 'Dim col_n As Long ' ' For f = 1 To 15 'Course slots won't be located further out than 15 columns, arbitrary value ' If Cells(2, f).Value = "Antall kursplass" Then col_n = f 'Next 'If cell value is numerical, insert number of rows equal to the cell value For i = 3 To 400 '400 = Arbitrary number If IsNumeric(Sheets("Sheet1").Cells(2, i).Value) = True Then cellValue = Sheets("Sheet1").Cells(2, i).Value cellCount = cellValue a = ActiveCell.Offset(1) b = ActiveCell.Offset(1) + CStr(cellCount) Set Sheets("Sheet1").Cells(2, i).Value = "=COUNTBLANK(a:b)" For j = 1 To cellCount ActiveCell.Offset(j).EntireRow.Insert Next j End If Next i End Sub 

这给我运行时错误'9',下标超出范围,在线设置表(“Sheet1”)。单元格(2,i)。值=“= COUNTBLANK(a:b)”

这是我的问题。 请注意,如果数据未被格式化,您可能会遇到麻烦,因为它似乎在您的顶端post中,或者如果列中有空单元格描述参与者的数量。

至于你自己的代码,我没有仔细研究它,因为我发现从头开始比较容易,但是从我看到的强烈build议你在模块的顶部使用Option Explicit ,强迫你声明所有的variables。 你在哪里例如获取NumCols或NumRows的值?

至于为什么子中止它的行,我相信这是因为您传递给Worksheets.Range()的参数是无效的。

 Sub insertRowsCourseSpace() Dim no_to_insert() As Variant, v As Variant, at_row_number As Long, i As Long no_to_insert = Range(Worksheets("Sheet1").Range("E2"), Worksheets("Sheet1").Range("E1048576").End(xlUp)) at_row_number = 2 For Each v In no_to_insert ' Inserts new rows Worksheets("Sheet1").Rows(CStr(at_row_number + 1) & ":" & CStr(at_row_number + CLng(v))).Insert shift:=xlDown ' Inserts formula Worksheets("Sheet1").Range("E" & CStr(at_row_number)).Formula = "=COUNTBLANK(B" & CStr(at_row_number + 1) & ":B" & CStr(at_row_number + CLng(v)) & ")" ' Name range Worksheets("Sheet1").Range("A2:E2").Offset(at_row_number - 2, 0).Resize(CLng(v) + 1, 5).Name = "Range" & CStr(i) i = i + 1 ' Decides where to insert the new set of rows at_row_number = at_row_number + CLng(v) + 1 Next With Worksheets("Sheet1").Range("A1") .Value = "01." .AutoFill .Resize(at_row_number, 1), xlFillSeries End With End Sub 

更新的代码:

 Sub insertRowsCourseSpace() Dim no_to_insert() As Variant, v As Variant, at_row_number As Long, i As Long no_to_insert = Range(Worksheets("Sheet1").Range("B3"), Worksheets("Sheet1").Range("B1048576").End(xlUp)) at_row_number = 3 For Each v In no_to_insert ' Inserts new rows Worksheets("Sheet1").Rows(CStr(at_row_number + 1) & ":" & CStr(at_row_number + CLng(v))).Insert shift:=xlDown ' Inserts formula Worksheets("Sheet1").Range("B" & CStr(at_row_number)).Formula = "=COUNTBLANK(A" & CStr(at_row_number + 1) & ":A" & CStr(at_row_number + CLng(v)) & ")" ' Name range Worksheets("Sheet1").Range("A3:H3").Offset(at_row_number - 3, 0).Resize(CLng(v) + 1, 8).Name = "Range" & CStr(i) i = i + 1 ' Decides where to insert the new set of rows at_row_number = at_row_number + CLng(v) + 1 Next 'With Worksheets("Sheet1").Range("A1") ' .Value = "01." ' .AutoFill .Resize(at_row_number, 1), xlFillSeries 'End With End Sub 

我可以build议将您的数据传输到MS访问? 即使你问的问题在Excel中很容易实现,但我不认为这会让你用一种方便的方式跟踪所有的事情。

我的build议是,在ms访问中创build两个表。 一个与所有的课程,并与所有参与者,无论课程。 您在参与者表中添加一个参考,其中您从第一个表中连接正确的课程ID。 之后,您可以轻松运行查询来获取所有数据。 如果你愿意,你可以随时将你的数据导出到excel。

如果你真的想出于任何原因在excel中做,请留下评论,我会帮你。