1

我正在尝试构建一个基于 excel 的输入表单,我在网上找到了一些东西,我正在尝试理解这些代码:

Dim Hsheet,Isheet As Worksheet
Dim NextRow, oCol As Long
Dim MyRng, MyCell As Range
Dim MyCopy, ClearCells As String

Set Hsheet = Worksheet("InputForm")
Set ISheet = Worksheet("Database")

这是我不明白的部分,有人可以给我解释一下吗?


With Hsheet
     nextRow = .Cells(.Rows.Count, "A").End(xlUp).Offset(1, 0).Row
End With

With Isheet
    Set myRng = .Range(MyCopy)

    If Application.CountA(myRng) <> myRng.Cells.Count Then
        MsgBox "Please fill in all the cells!"
        Exit Sub
    End If
End With

还有这部分,有人可以向我解释一下吗?

With Hsheet
    .Cells(nextRow, "a").Value = Application.UserName
    oCol = 1
    For Each myCell In MyRng.Cells
        Hsheet.Cells(NextRow, oCol).Value = myCell.Value
        oCol = oCol + 1
    Next myCell
End With

提前致谢 :)

With Isheet
  On Error Resume Next
     With .Range(ClearCells).Cells.SpecialCells(xlCellTypeConstants)
          .ClearContents
          Application.Goto .Cells(1) ', Scroll:=True
     End With
  On Error GoTo 0
End With
4

2 回答 2

4

我可以解释代码的作用,但我想提的很少:)

一种

Dim Hsheet,Isheet As Worksheet
Dim NextRow, oCol As Long
Dim MyRng, MyCell As Range
Dim MyCopy, ClearCells As String

这不是声明变量/对象的正确方法例如,如果您考虑这一行

Dim Hsheet,Isheet As Worksheet

在这里, onlyIsheet被声明为工作表,而不是Hsheet. Hsheet自动成为一个体。正确的方法是

Dim Hsheet As Worksheet, Isheet As Worksheet
Dim NextRow As Long, oCol As Long
Dim MyRng As Range, MyCell As Range
Dim MyCopy As String, ClearCells As String

With Hsheet
     nextRow = .Cells(.Rows.Count, "A").End(xlUp).Offset(1, 0).Row
End With

这段代码的作用是尝试找到在 Col A 中有数据的最后一行,然后向下偏移一行以获得下一个空行,以便您可以写入它。

这里提到了另一种写相同东西的方法所以上面的代码也可以写成

With Hsheet
     nextRow = .Range("A" & .Rows.Count).End(xlUp).Row + 1
End With

C

With Isheet
    Set myRng = .Range(MyCopy)

    If Application.CountA(myRng) <> myRng.Cells.Count Then
        MsgBox "Please fill in all the cells!"
        Exit Sub
    End If
End With

我相信MyCopy应该保持一些我在你的代码中看不到的价值。假设它拥有一个有效的单元格地址,代码试图做的是通过比较单元格计数与填充的单元格数来确保所有单元格都被填满。

D

With Hsheet
    .Cells(NextRow, "a").Value = Application.UserName
    oCol = 1
    For Each myCell In MyRng.Cells
        Hsheet.Cells(NextRow, oCol).Value = myCell.Value
        oCol = oCol + 1
    Next myCell
End With 

这也很简单。该代码将 存储UserName在 Col A 中的下一个可用单元格中,然后将 Range MyRng 中的值存储在 SheetIsheet中的 Col A 中Hsheet

高温高压

于 2013-01-01T19:35:19.440 回答
0

您的一段代码似乎从一张纸复制到另一张纸,将用户名添加到一个范围的顶部。
但是字符串变量MyCopy似乎没有被初始化,因此我认为按原样运行这个宏不会产生任何期望的结果(除非Range函数在使用空字符串调用时返回一些单元格?我不知道它的规格)。

我不完全记得 Excel VBA,但我认为:

Cells(.Rows.Count, "A")选择位于最后一行“A”列的单元格。
End(xlUp)将选择移动到连续非空单元格范围的顶部(CTRL + UP我认为就像在 Excel 中按下一样)。
Offset(1, 0)将所选内容移动到底部的一个单元格。 Row返回该单元格的行号。

因此,您的第一个代码块将 A 列中最后一个非空单元格范围的第二行的行号设置为变量nextRow.

您可以按照相同的推理来理解所有其他代码块的用途。我建议您搜索 MSDN 的 VBA for Excel 文档网站,以获取有关您还不了解的每个功能的含义的更多信息。

于 2013-01-01T19:21:52.090 回答