添加行、复制工作簿、导入数据和格式
Add rows, duplicate workbook, import data and format
我正在尝试为库存管理创建一个 Excel 文档。我已经创建了一个工作簿,其中添加了 "daily sales" 和 "deliveries",sheet 维护更新的库存,计算收入和净利润。这都是在传统的 Excel 中完成的;然而,这个 sheet 有一些问题,即我必须自己复制 sheet 并在以后的每个月更改它(我在非洲的偏远地区,那里的人们不了解计算机,所以界面一定很简单)。
我最近发现了 VBA 宏,并且一直在为此编写它们 sheet。到目前为止,我已经编写了一个用户表单,其中包含月份和年份的下拉菜单,当您按下回车键时,程序会复制一个 "master" 文档,自动填充顶部的日期并将工作簿保存为输入的月份和年份。我的问题是:如何删除新工作簿中的最后一列? Mastersheet中有31列,但并不是所有月份都有31天,所以我想删除不需要的列,而不删除后面的"total"列。格式化文档后,我想从该清单的最后一列导入上个月的数据 sheet。
这是我正在努力处理的代码部分。我希望能够删除在下个月的前几天自动填充的额外列,例如 28-Feb-16 然后 1-Mar-16 然后 2-Mar-16,在那里我可以该程序找到三月日期并删除它们的关联列。
Private Sub CmdEnter_Click()
'Duplicate Sheet
Sheets(Array("Daily Sales", "Total Inventory", "Deliveries",_
"Income Statement", "Profits")).Copy
'Fill Dates in Daily Sales
Sheets("Daily Sales").Activate
'Enter combo boxes into first cell
Range("B6").Select
ActiveCell = CDate("1-" & CmboMonth.Value & "-" &_
CmboYear.Value)
'Fill in Month Dates
Selection.AutoFill Destination:=Range("B6:AF6"), _
Type:=xlFillValues
'Auto-Size Columns
Cells.Select
Cells.EntireColumn.AutoFit
'
'Fill Dates in Total Inventory
Sheets("Total Inventory").Activate
'Enter combo boxes into first cell
Range("C5").Select
ActiveCell = CDate("1-" & CmboMonth.Value & "-" &_
CmboYear.Value)
'Fill in Month Dates
Selection.AutoFill Destination:=Range("C5:AG5"),_
Type:=xlFillValues
'Auto-Size Columns
Cells.Select
Cells.EntireColumn.AutoFit
'
'Fill Dates in Deliveries
Sheets("Deliveries").Activate
'Enter combo boxes into first cell
Range("B6").Select
ActiveCell = CDate("1-" & CmboMonth.Value & "-" &_
CmboYear.Value)
'Fill in Month Dates
Selection.AutoFill Destination:=Range("B6:AF6"),_
Type:=xlFillValues
'Auto-Size Columns
Cells.Select
Cells.EntireColumn.AutoFit
'
'Fill Dates in Income Statement
Sheets("Income Statement").Activate
'Enter combo boxes into first cell
Range("C4").Select
ActiveCell = CDate("1-" & CmboMonth.Value & "-" &_
CmboYear.Value)
'Fill in Month Dates
Selection.AutoFill Destination:=Range("C4:AG4"),_
Type:=xlFillValues
'Auto-Size Columns
Cells.Select
Cells.EntireColumn.AutoFit
'
'Fill Dates in Profits
Sheets("Profits").Activate
'Enter combo boxes into first cell
Range("E4").Select
ActiveCell = CDate("1-" & CmboMonth.Value & "-" &_
CmboYear.Value)
'Fill in Month Dates
Selection.AutoFill Destination:=Range("E4:AI4"),_
Type:=xlFillValues
'Auto-Size Columns
Cells.Select
Cells.EntireColumn.AutoFit
'Save As
ActiveWorkbook.SaveAs Filename:= _
"Macintosh HD:Users:meringue90:Desktop:" & CmboMonth.Value &_
CmboYear.Value , FileFormat:= _
xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
End Sub
我希望这是有道理的。我还应该指出,我是 VBA.
的新手
所以,我已经解决了我的问题。答案很麻烦。我刚刚设置了一个 "Select Case",我在其中为没有 31 天的每个月创建了一个单独的案例,并让程序为每个月删除了正确数量的列。这是我拥有的:
'Delete extra columns
Select Case Me.CmboMonth.Value
Case "February"
Select Case Me.CmboYear.Value
Case "2016"
Sheets("Daily Sales").Select
Columns("AE:AF").Select
Selection.Delete Shift:=xlToLeft
Sheets("Total Inventory").Select
Columns("AF:AG").Select
Selection.Delete Shift:=xlToLeft
Sheets("Deliveries").Select
Columns("AE:AF").Select
Selection.Delete Shift:=xlToLeft
Sheets("Income Statement").Select
Columns("AF:AG").Select
Selection.Delete Shift:=xlToLeft
Sheets("Profits").Select
Columns("AH:AI").Select
Selection.Delete Shift:=xlToLeft
Case "2020"
Sheets("Daily Sales").Select
Columns("AE:AF").Select
Selection.Delete Shift:=xlToLeft
Sheets("Total Inventory").Select
Columns("AF:AG").Select
Selection.Delete Shift:=xlToLeft
Sheets("Deliveries").Select
Columns("AE:AF").Select
Selection.Delete Shift:=xlToLeft
Sheets("Income Statement").Select
Columns("AF:AG").Select
Selection.Delete Shift:=xlToLeft
Sheets("Profits").Select
Columns("AH:AI").Select
Selection.Delete Shift:=xlToLeft
Case "2024"
Sheets("Daily Sales").Select
Columns("AE:AF").Select
Selection.Delete Shift:=xlToLeft
Sheets("Total Inventory").Select
Columns("AF:AG").Select
Selection.Delete Shift:=xlToLeft
Sheets("Deliveries").Select
Columns("AE:AF").Select
Selection.Delete Shift:=xlToLeft
Sheets("Income Statement").Select
Columns("AF:AG").Select
Selection.Delete Shift:=xlToLeft
Sheets("Profits").Select
Columns("AH:AI").Select
Selection.Delete Shift:=xlToLeft
Case "2028"
Sheets("Daily Sales").Select
Columns("AE:AF").Select
Selection.Delete Shift:=xlToLeft
Sheets("Total Inventory").Select
Columns("AF:AG").Select
Selection.Delete Shift:=xlToLeft
Sheets("Deliveries").Select
Columns("AE:AF").Select
Selection.Delete Shift:=xlToLeft
Sheets("Income Statement").Select
Columns("AF:AG").Select
Selection.Delete Shift:=xlToLeft
Sheets("Profits").Select
Columns("AH:AI").Select
Selection.Delete Shift:=xlToLeft
Case "2032"
Sheets("Daily Sales").Select
Columns("AE:AF").Select
Selection.Delete Shift:=xlToLeft
Sheets("Total Inventory").Select
Columns("AF:AG").Select
Selection.Delete Shift:=xlToLeft
Sheets("Deliveries").Select
Columns("AE:AF").Select
Selection.Delete Shift:=xlToLeft
Sheets("Income Statement").Select
Columns("AF:AG").Select
Selection.Delete Shift:=xlToLeft
Sheets("Profits").Select
Columns("AH:AI").Select
Selection.Delete Shift:=xlToLeft
Case Else
Sheets("Daily Sales").Select
Columns("AD:AF").Select
Selection.Delete Shift:=xlToLeft
Sheets("Total Inventory").Select
Columns("AE:AG").Select
Selection.Delete Shift:=xlToLeft
Sheets("Deliveries").Select
Columns("AD:AF").Select
Selection.Delete Shift:=xlToLeft
Sheets("Income Statement").Select
Columns("AE:AG").Select
Selection.Delete Shift:=xlToLeft
Sheets("Profits").Select
Columns("AG:AI").Select
Selection.Delete Shift:=xlToLeft
End Select
Case "April" Or "June" Or "September" Or "November"
Sheets("Daily Sales").Select
Columns("AF:AF").Select
Selection.Delete Shift:=xlToLeft
Sheets("Total Inventory").Select
Columns("AG:AG").Select
Selection.Delete Shift:=xlToLeft
Sheets("Deliveries").Select
Columns("AF:AF").Select
Selection.Delete Shift:=xlToLeft
Sheets("Income Statement").Select
Columns("AG:AG").Select
Selection.Delete Shift:=xlToLeft
Sheets("Profits").Select
Columns("AI:AI").Select
Selection.Delete Shift:=xlToLeft
End Select
绝对不是优雅的,但它或多或少做了我需要的。
问题在于这一行及其等价物:
Selection.AutoFill Destination:=Range("B6:AF6"), Type:=xlFillValues
您正在从第 B
列填充到第 AF
列,而没有考虑有多少天,这就是问题所在。一种更智能*的日期填写方式将不再需要删除开头的列。
在您的原始代码上尝试类似这样的变体:
Private Sub CmdEnter_Click()
Dim Days as Integer
Dim StartDate as Date
StartDate = CDate("1-" & CmboMonth.Value & "-" & CmboYear.Value)
Days = DateDiff("d", StartDate, DateAdd("m", 1, StartDate)) - 1
'Duplicate Sheet
Sheets(Array("Daily Sales", "Total Inventory", "Deliveries",_
"Income Statement", "Profits")).Copy
'Fill Dates in Daily Sales
Sheets("Daily Sales").Activate
'Enter combo boxes into first cell
Range("B6").Select
ActiveCell = StartDate
'Fill in Month Dates
Selection.AutoFill Destination:=Range(Cells(6,2), Cells(6, 2+Days)), _
Type:=xlFillValues
'the rest of the code here...
- 设置一个名为
StartDate
的变量并计算一次可以简化您从表单计算日期的所有时间。您现在可以将每个出现的 CDate("1-" & CmboMonth.Value & "-" & CmboYear.Value)
替换为 StartDate
。这使您的代码更易于阅读、理解和维护。
Days
是使用几个内置的 Excel 函数计算的:
DateAdd
可以方便地计算未来或过去的日期。我用它为 StartDate
. 添加了 1 个月
然后使用 DateDiff
来计算 StartDate
和 one month from the StartDate
之间的差异。然后减去1,因为你需要比那个月的天数少复制一次(即你已经填写了该月的第一天)。
Range("B6:AF6")
硬编码了您的目标范围,Range(Cells(), Cells())
是通过指定 Row/Column(而不是 Column/Row),并允许您使用整数而不是字母作为列。这使编程变得更加容易,因为您不必将计算的列号转换为字母组合。
- 只需为您需要放置日期的每张纸复制
Selection.AutoFill...
行。
*注意: "More intelligent" 是参考代码,而不是编码器。我们都必须从某个地方开始,如果您不开始并提出问题,您将永远学不会。
很明显,您已经开始使用宏录制器,这是一个很好的起点。不幸的是,如果您依赖宏记录器,您会在编码中养成一些坏习惯,这些习惯会导致您编写更多的行,这些行比必要的更难以遵循。当你让这个例程工作时,我建议你 post 你的 working code on Code Review 并要求一些意见在那里使代码更具可读性和高效的。那里有一些很棒的人,他们很乐意帮助您提高代码编写技能。
我正在尝试为库存管理创建一个 Excel 文档。我已经创建了一个工作簿,其中添加了 "daily sales" 和 "deliveries",sheet 维护更新的库存,计算收入和净利润。这都是在传统的 Excel 中完成的;然而,这个 sheet 有一些问题,即我必须自己复制 sheet 并在以后的每个月更改它(我在非洲的偏远地区,那里的人们不了解计算机,所以界面一定很简单)。
我最近发现了 VBA 宏,并且一直在为此编写它们 sheet。到目前为止,我已经编写了一个用户表单,其中包含月份和年份的下拉菜单,当您按下回车键时,程序会复制一个 "master" 文档,自动填充顶部的日期并将工作簿保存为输入的月份和年份。我的问题是:如何删除新工作簿中的最后一列? Mastersheet中有31列,但并不是所有月份都有31天,所以我想删除不需要的列,而不删除后面的"total"列。格式化文档后,我想从该清单的最后一列导入上个月的数据 sheet。
这是我正在努力处理的代码部分。我希望能够删除在下个月的前几天自动填充的额外列,例如 28-Feb-16 然后 1-Mar-16 然后 2-Mar-16,在那里我可以该程序找到三月日期并删除它们的关联列。
Private Sub CmdEnter_Click()
'Duplicate Sheet
Sheets(Array("Daily Sales", "Total Inventory", "Deliveries",_
"Income Statement", "Profits")).Copy
'Fill Dates in Daily Sales
Sheets("Daily Sales").Activate
'Enter combo boxes into first cell
Range("B6").Select
ActiveCell = CDate("1-" & CmboMonth.Value & "-" &_
CmboYear.Value)
'Fill in Month Dates
Selection.AutoFill Destination:=Range("B6:AF6"), _
Type:=xlFillValues
'Auto-Size Columns
Cells.Select
Cells.EntireColumn.AutoFit
'
'Fill Dates in Total Inventory
Sheets("Total Inventory").Activate
'Enter combo boxes into first cell
Range("C5").Select
ActiveCell = CDate("1-" & CmboMonth.Value & "-" &_
CmboYear.Value)
'Fill in Month Dates
Selection.AutoFill Destination:=Range("C5:AG5"),_
Type:=xlFillValues
'Auto-Size Columns
Cells.Select
Cells.EntireColumn.AutoFit
'
'Fill Dates in Deliveries
Sheets("Deliveries").Activate
'Enter combo boxes into first cell
Range("B6").Select
ActiveCell = CDate("1-" & CmboMonth.Value & "-" &_
CmboYear.Value)
'Fill in Month Dates
Selection.AutoFill Destination:=Range("B6:AF6"),_
Type:=xlFillValues
'Auto-Size Columns
Cells.Select
Cells.EntireColumn.AutoFit
'
'Fill Dates in Income Statement
Sheets("Income Statement").Activate
'Enter combo boxes into first cell
Range("C4").Select
ActiveCell = CDate("1-" & CmboMonth.Value & "-" &_
CmboYear.Value)
'Fill in Month Dates
Selection.AutoFill Destination:=Range("C4:AG4"),_
Type:=xlFillValues
'Auto-Size Columns
Cells.Select
Cells.EntireColumn.AutoFit
'
'Fill Dates in Profits
Sheets("Profits").Activate
'Enter combo boxes into first cell
Range("E4").Select
ActiveCell = CDate("1-" & CmboMonth.Value & "-" &_
CmboYear.Value)
'Fill in Month Dates
Selection.AutoFill Destination:=Range("E4:AI4"),_
Type:=xlFillValues
'Auto-Size Columns
Cells.Select
Cells.EntireColumn.AutoFit
'Save As
ActiveWorkbook.SaveAs Filename:= _
"Macintosh HD:Users:meringue90:Desktop:" & CmboMonth.Value &_
CmboYear.Value , FileFormat:= _
xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
End Sub
我希望这是有道理的。我还应该指出,我是 VBA.
的新手所以,我已经解决了我的问题。答案很麻烦。我刚刚设置了一个 "Select Case",我在其中为没有 31 天的每个月创建了一个单独的案例,并让程序为每个月删除了正确数量的列。这是我拥有的:
'Delete extra columns
Select Case Me.CmboMonth.Value
Case "February"
Select Case Me.CmboYear.Value
Case "2016"
Sheets("Daily Sales").Select
Columns("AE:AF").Select
Selection.Delete Shift:=xlToLeft
Sheets("Total Inventory").Select
Columns("AF:AG").Select
Selection.Delete Shift:=xlToLeft
Sheets("Deliveries").Select
Columns("AE:AF").Select
Selection.Delete Shift:=xlToLeft
Sheets("Income Statement").Select
Columns("AF:AG").Select
Selection.Delete Shift:=xlToLeft
Sheets("Profits").Select
Columns("AH:AI").Select
Selection.Delete Shift:=xlToLeft
Case "2020"
Sheets("Daily Sales").Select
Columns("AE:AF").Select
Selection.Delete Shift:=xlToLeft
Sheets("Total Inventory").Select
Columns("AF:AG").Select
Selection.Delete Shift:=xlToLeft
Sheets("Deliveries").Select
Columns("AE:AF").Select
Selection.Delete Shift:=xlToLeft
Sheets("Income Statement").Select
Columns("AF:AG").Select
Selection.Delete Shift:=xlToLeft
Sheets("Profits").Select
Columns("AH:AI").Select
Selection.Delete Shift:=xlToLeft
Case "2024"
Sheets("Daily Sales").Select
Columns("AE:AF").Select
Selection.Delete Shift:=xlToLeft
Sheets("Total Inventory").Select
Columns("AF:AG").Select
Selection.Delete Shift:=xlToLeft
Sheets("Deliveries").Select
Columns("AE:AF").Select
Selection.Delete Shift:=xlToLeft
Sheets("Income Statement").Select
Columns("AF:AG").Select
Selection.Delete Shift:=xlToLeft
Sheets("Profits").Select
Columns("AH:AI").Select
Selection.Delete Shift:=xlToLeft
Case "2028"
Sheets("Daily Sales").Select
Columns("AE:AF").Select
Selection.Delete Shift:=xlToLeft
Sheets("Total Inventory").Select
Columns("AF:AG").Select
Selection.Delete Shift:=xlToLeft
Sheets("Deliveries").Select
Columns("AE:AF").Select
Selection.Delete Shift:=xlToLeft
Sheets("Income Statement").Select
Columns("AF:AG").Select
Selection.Delete Shift:=xlToLeft
Sheets("Profits").Select
Columns("AH:AI").Select
Selection.Delete Shift:=xlToLeft
Case "2032"
Sheets("Daily Sales").Select
Columns("AE:AF").Select
Selection.Delete Shift:=xlToLeft
Sheets("Total Inventory").Select
Columns("AF:AG").Select
Selection.Delete Shift:=xlToLeft
Sheets("Deliveries").Select
Columns("AE:AF").Select
Selection.Delete Shift:=xlToLeft
Sheets("Income Statement").Select
Columns("AF:AG").Select
Selection.Delete Shift:=xlToLeft
Sheets("Profits").Select
Columns("AH:AI").Select
Selection.Delete Shift:=xlToLeft
Case Else
Sheets("Daily Sales").Select
Columns("AD:AF").Select
Selection.Delete Shift:=xlToLeft
Sheets("Total Inventory").Select
Columns("AE:AG").Select
Selection.Delete Shift:=xlToLeft
Sheets("Deliveries").Select
Columns("AD:AF").Select
Selection.Delete Shift:=xlToLeft
Sheets("Income Statement").Select
Columns("AE:AG").Select
Selection.Delete Shift:=xlToLeft
Sheets("Profits").Select
Columns("AG:AI").Select
Selection.Delete Shift:=xlToLeft
End Select
Case "April" Or "June" Or "September" Or "November"
Sheets("Daily Sales").Select
Columns("AF:AF").Select
Selection.Delete Shift:=xlToLeft
Sheets("Total Inventory").Select
Columns("AG:AG").Select
Selection.Delete Shift:=xlToLeft
Sheets("Deliveries").Select
Columns("AF:AF").Select
Selection.Delete Shift:=xlToLeft
Sheets("Income Statement").Select
Columns("AG:AG").Select
Selection.Delete Shift:=xlToLeft
Sheets("Profits").Select
Columns("AI:AI").Select
Selection.Delete Shift:=xlToLeft
End Select
绝对不是优雅的,但它或多或少做了我需要的。
问题在于这一行及其等价物:
Selection.AutoFill Destination:=Range("B6:AF6"), Type:=xlFillValues
您正在从第 B
列填充到第 AF
列,而没有考虑有多少天,这就是问题所在。一种更智能*的日期填写方式将不再需要删除开头的列。
在您的原始代码上尝试类似这样的变体:
Private Sub CmdEnter_Click()
Dim Days as Integer
Dim StartDate as Date
StartDate = CDate("1-" & CmboMonth.Value & "-" & CmboYear.Value)
Days = DateDiff("d", StartDate, DateAdd("m", 1, StartDate)) - 1
'Duplicate Sheet
Sheets(Array("Daily Sales", "Total Inventory", "Deliveries",_
"Income Statement", "Profits")).Copy
'Fill Dates in Daily Sales
Sheets("Daily Sales").Activate
'Enter combo boxes into first cell
Range("B6").Select
ActiveCell = StartDate
'Fill in Month Dates
Selection.AutoFill Destination:=Range(Cells(6,2), Cells(6, 2+Days)), _
Type:=xlFillValues
'the rest of the code here...
- 设置一个名为
StartDate
的变量并计算一次可以简化您从表单计算日期的所有时间。您现在可以将每个出现的CDate("1-" & CmboMonth.Value & "-" & CmboYear.Value)
替换为StartDate
。这使您的代码更易于阅读、理解和维护。 Days
是使用几个内置的 Excel 函数计算的:DateAdd
可以方便地计算未来或过去的日期。我用它为StartDate
. 添加了 1 个月
然后使用 DateDiff
来计算StartDate
和one month from the StartDate
之间的差异。然后减去1,因为你需要比那个月的天数少复制一次(即你已经填写了该月的第一天)。
Range("B6:AF6")
硬编码了您的目标范围,Range(Cells(), Cells())
是通过指定 Row/Column(而不是 Column/Row),并允许您使用整数而不是字母作为列。这使编程变得更加容易,因为您不必将计算的列号转换为字母组合。- 只需为您需要放置日期的每张纸复制
Selection.AutoFill...
行。
*注意: "More intelligent" 是参考代码,而不是编码器。我们都必须从某个地方开始,如果您不开始并提出问题,您将永远学不会。
很明显,您已经开始使用宏录制器,这是一个很好的起点。不幸的是,如果您依赖宏记录器,您会在编码中养成一些坏习惯,这些习惯会导致您编写更多的行,这些行比必要的更难以遵循。当你让这个例程工作时,我建议你 post 你的 working code on Code Review 并要求一些意见在那里使代码更具可读性和高效的。那里有一些很棒的人,他们很乐意帮助您提高代码编写技能。