-1

我正在尝试为库存管理创建一个 Excel 文档。我已经创建了一个工作簿,其中添加了“每日销售额”和“交货”,并且该工作表维护了更新的库存,计算收入和净利润。这一切都在传统的 Excel 中完成;但是,这张表有一些问题,就是我必须自己复制这张表,以后每个月都要换一次(我在非洲偏远的地方,那里的人不懂电脑,所以界面一定很简单的)。

我最近发现了 VBA 宏,并一直在为这张表编写它们。到目前为止,我已经编写了一个用户表单,其中包含月份和年份的下拉菜单,当您按 Enter 键时,程序会复制一个“主”文档,自动填充顶部的日期并将工作簿保存为输入的月份和年份。我的问题是:如何删除新工作簿中的最后一列?在主表中,有 31 列,但并非所有月份都有 31 天,所以我想删除不必要的列,而不删除后面的“总计”列。格式化文档后,我想从该库存表的最后一列导入上个月的数据。

这是我正在努力解决的代码的一部分。我希望能够删除在下个月的前几天自动填充的额外列,例如,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 相当陌生。

4

2 回答 2

1

问题在于这一行及其等价物:

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方便计算未来或过去的日期。我用它来增加 1 个月StartDate
    • DateDiffStartDate然后用于计算和之间的差异one month from the StartDate。然后减去 1,因为您需要比该月的天数少一次复制它(即,您已经填写了该月的第一天)。
  • Range("B6:AF6")硬编码您的目标范围,Range(Cells(), Cells())是通过指定行/列(而不是列/行)来告诉 Excel 您想要什么范围的另一种方法,并允许您使用整数而不是字母作为列。这使编程变得更加容易,因为您不必将计算的列号转换为字母组合。
  • Selection.AutoFill...只需为您需要放置日期的每张纸复制该行。

*注意: “更智能”是指代码,而不是编码器。我们都必须从某个地方开始,如果你没有开始并提出要求,你就永远学不会。

很明显,您已经开始使用宏记录器,这是一个很好的起点。不幸的是,如果你依赖宏记录器,你会在编码中学习一些坏习惯,这将导致你编写更多的行,这些行比必要的更难遵循。当你让这个例程正常工作时,我建议你在Code Review上发布你的工作代码,并在那里征求一些意见,以使代码更具可读性和效率。那里有一些很棒的人会很乐意帮助您提高代码编写技能。

于 2015-05-11T12:46:08.587 回答
0

所以,我已经解决了我的问题。答案很麻烦。我刚刚设置了一个“选择案例”,在其中我为每个月创建了一个没有 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

绝对不是优雅的,但它或多或少地做了我需要的事情。

于 2015-05-11T12:20:50.930 回答