添加行,复制工作簿,导入数据和格式

时间:2015-05-10 13:04:05

标签: vba excel-vba insert code-formatting inventory-management

我正在尝试为库存管理创建Excel文档。我已经创建了一个工作簿,其中"每日销售"和"交付"添加并且工作表维护更新的库存,计算收入和净利润。这一切都在传统的Excel中完成;然而,这张表有一些问题,即我必须自己复制表单并在将来每个月更改它(我在非洲的一个偏远地区,人们不是计算机知识,因此界面必须非常简单)。

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

这是我正在努力解决的代码的一部分。我希望能够删除下个月前几天自动填写的额外列,例如,28-Feb-16然后1-Mar-16然后2-Mar-16,我可以在那里程序找到March日期并删除它们的相关列。

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很新。

2 个答案:

答案 0 :(得分: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
    • 然后使用
    • DateDiff来计算StartDateone month from the StartDate之间的差异。然后减1,因为你需要比那个月的天数少一些时间(即你已经在当月的第一天填写)。
  • Range("B6:AF6")硬编码了您的目的地范围,Range(Cells(), Cells())是通过指定行/列(而不是列/行)告诉Excel您想要的范围的另一种方法,并允许您使用整数而不是列的字母。这使得编程变得更加容易,因为您不必将计算的列号转换为字母组合。
  • 只需复制您日期所需的每张纸的Selection.AutoFill...行。

*注意:"更聪明"是参考代码,而不是编码器。我们都必须从某个地方开始,如果你还没有开始和问,你就永远不会学习。

很明显,您已经开始使用Macro Recorder,这是一个很好的起点。不幸的是,如果您依赖宏录制器,您将在编码中学习一些不良习惯,这会导致您编写更多难以理解的行,而不是必要的行。当您开始使用此例程时,我建议您在Code Review上发布工作代码并在那里请求一些输入,以使代码更具可读性和效率。那里有一些很棒的人会很乐意帮助你提高你的代码编写技巧。

答案 1 :(得分: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

绝对不是优雅的,但它或多或少地符合我的需要。