gpt4 book ai didi

vba - 希望在 Excel 中选择不确定数量的行作为较大 VBA 宏的一部分

转载 作者:行者123 更新时间:2023-12-02 09:05:35 25 4
gpt4 key购买 nike

我正在处理一本包含大量工作表的 Excel 书籍;第一个工作表链接到外部程序并通过外部函数提取数据,导入的行数差异很大。

该 block 数据分布在许多后续工作表上。第一步是使用工作表 1 中的行数填充 A 列(行名称)。从这里开始,数据被拆分为多个列(当前为 B->L)。顶行使用 IF() 函数填充第一行,我希望编写一个干净的宏来将此公式复制到第 x 行(随每次数据导入刷新而变化),然后粘贴可管理文件大小的值.

这是我到目前为止所得到的;它可以工作,但它相当(读:非常!)笨拙:

Sub Refresh_Data()  
Sheets("Sheet2").Select
ActiveWindow.ScrollWorkbookTabs Sheets:=13
Sheets(Array("Sheet2" ... "Sheet25")).Select
Sheets("Sheet2").Activate
Sheets("Sheet25").Select Replace:=False
Range("B1:L1").Select
Selection.Copy
Range("__B2:B1000__").Select
ActiveSheet.Paste
Application.Calculate
ActiveWindow.ScrollWorkbookTabs Position:=xlFirst
Sheets(Array("Sheet2" ... "Sheet25")).Select
Sheets("Sheet2").Activate
Sheets("Sheet25").Select Replace:=False
Sheets("Sheet2").Select
Range("B3").Select
Sheets(Array("Sheet2" ... "Sheet25")).Select
Sheets("Sheet2").Activate
Sheets("Sheet25").Select Replace:=False
Range("B3:L4").Select
Range("__B2:L1000__").Select
Application.CutCopyMode = False
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Check_sheet").Select
MsgBox "Update complete"
End Sub`

我想要实现的主要目标是将代码 B2:L1000 替换为可以评估 A 列中的行数并相应地选择 B 到 L 行中的范围的代码。

由于 L 列是最后填充的列,因此我不明白为什么不能水平完成此操作,而不是定义“B:L”,以防将来需要添加列。

最佳答案

尽管之前的答案有其优点:

1)我不会使用COUNTA,因为如果行或列中有空单元格,底部或右侧的单元格将被忽略。

2)我永远不会依赖用户在运行宏之前选择要使用的正确工作表;尤其是有这么多张纸的一张。

我对这个问题的 react 是,您已经设置了宏记录,在工作簿中徘徊,然后停止了记录。您选择一件事,然后选择另一件事。您滚动浏览表格。对我来说,大多数陈述并不笨拙,而是毫无意义。

以下内容确实包含了有关查找 A 列最后一行的问题的答案,但它更多的是有关查找范围的维度、获取范围之外的数据然后将其放在其他位置的教程。这似乎是您试图用对 VBA 最基本的了解来做的大部分事情。如果这种批评不公平,我很抱歉,但这就是你的问题给我的印象。

Sub Test()

Dim RowS01Max As Integer
Dim Sheet1Data() As Variant

' With Sheets("Sheet1") allows you to access data within worksheet Sheet1
' without selecting it.
' Range("A1:C11") refers to a range within the active sheet
' .Range("A1:C11") refers to a range within the sheet identified in the
' With statement.
' ^ Note the dot
With Sheets("Sheet1")

' Rows.Count is the number of rows for the version of Excel you are using.
' .Cells(Rows.Count, "A") address the bottom row of column A of worksheet
' Sheet1.
' .Cells(Rows.Count, 1) refer to column A by number.
' End(xlUp) is the VBA equivalent of Ctrl+Up.
' If you positioned the cursor at the bottom of column A and pressed
' Ctrl+Up, the cursor would jump to the last row in column A with a value.
' The following statement gets that row number without actually moving
' the cursor.
RowS01Max = .Cells(Rows.Count, "A").End(xlUp)

' The following statement loads the contents of range A1:C11 of
' Sheets("Sheet1") into array Sheet1Data.
Sheet1Data = .Range("A1:C11").Value

' This is the same statement but the range is specified in a different way.
' .Cells(Row,Column) identifies a single cell within the sheet specified in
' the With statement. .Cells(1,1) identifies row 1, column 1 which is A1.
'. Cells(11, "C") identifies row 11, column C which is C11.
Sheet1Data = .Range(.Cells(1, 1), .Cells(11, "C")).Value

' This statement uses RowS01Max to specify the last row
Sheet1Data = .Range(.Cells(1, 1), .Cells(RowS01Max, 1)).Value

' In all three examples above, the contents of the specified range will
' be loaded to array Sheet1Data. Whichever range you pick, Sheet1Data
' will always be a two dimensional array with the first dimension being
' the row and the second dimension being the column.

' In the first two examples Sheet1Data(5,3) contains the contents
' of cell C5. In the third example, I have only loaded column A but the
' array will still has two dimensions but the only permitted value for the
' second dimension is 1.

' The following statement writes the contents of Sheet1Data to column "E"

.Range(.Cells(1, 5), .Cells(RowS01Max, 5)).Value = Sheet1Data

End With

With Sheets("Sheet2")

' The following statement writes the contents of Sheet1Data to column "E"
' of worksheet Sheet2.
.Range(.Cells(1, 5), .Cells(RowS01Max, 5)).Value = Sheet1Data

End With

End Sub

不要绝望!我们大多数人都是从宏记录器开始的,并且仍然使用它来发现不熟悉的命令的语法。看看其他问题。有些人询问奇特的功能,但对于经验丰富的程序员来说,许多人询问的是如何以简单的方式移动数据。针对提问者的问题设置一些工作簿。将解决方案复制并粘贴到模块中。使用 F8 单步执行(查看调试器),在 Excel 和编辑器之间切换,观察工作表发生的情况,并将光标移到变量上以查看其当前值。玩了半天。你会惊讶地发现它这么快就变得有意义了。祝你好运和良好的编程。

关于vba - 希望在 Excel 中选择不确定数量的行作为较大 VBA 宏的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8403069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com