【问题标题】:Excel: How to duplicate without some specified cells? [closed]Excel:如何在没有指定单元格的情况下进行复制? [关闭]
【发布时间】:2013-11-18 22:37:46
【问题描述】:

所以基本上,我想在我的一个工作表上创建一个超链接,让我可以准确地复制它,而不需要几个单元格。

我在 Microsoft 支持网站上发现了这个,它允许工作表完全复制:

Sub Copier1()
    ActiveWorkbook.Sheets("Invoice").Copy _
       after:=ActiveWorkbook.Sheets("Invoice")
End Sub

举个更好的例子,我正在制作一个发票生成器。我可以输入价格和产品,以及计算总计。我正在尝试制作一个简单的按钮,以在空白的新工作表中创建新发票,同时使我的发票编号增加 1。

带有透明红色的单元格是不应复制的单元格。虽然,它们包含应该复制的公式。有没有办法在“重置”它并将发票编号加1时复制完整的工作表? 所有需要“重置”的单元格都可以在宏中进行硬编码,因为发票布局始终相同。

我怎样才能做到这一点?

【问题讨论】:

  • 您似乎没有太多的 VBA 知识,甚至对您想要做什么的想法也不太清楚,也许您应该在询问之前在这两个方面工作。一个例子来理解这一点:假设你想复制除“A1”、“B3”和“B4”之外的所有单元格;这样做很容易(与您发布的代码类似大小);但是随后您将希望动态选择这些单元格,例如,通过单击它们,因此您必须学会处理它;然后你会希望跳过可变数量的单元格,因此你也必须学习这个......
  • ... 显然你有一些网络经验:你对某人(没有网络经验)的问题的回答是什么?存储信息和所有这些”?
  • @varocarbas - 很抱歉,我匆匆回答了这个问题,但没有为任何用户提供足够的信息来确定我的目标。在我的问题中添加了更多信息,以及供参考的图片。
  • 看到了吗?这是一个完全不同的故事。好多了;但是您仍然没有澄清选择是如何发生的:单元格是硬编码的还是用户应该选择他想要的?如果用户将执行选择,您打算如何执行此操作?通过背景颜色,通过选择范围?等
  • @fizzix 感谢您的更新!细节很有帮助。

标签: vba excel excel-2011


【解决方案1】:

这会复制工作表,然后清除产品信息

Sub createNewInvoice()
'this assumes the top portion of the invoice never changes
Dim startRow As Integer
Dim startCol As Integer
Dim invNumber As Integer
Dim ws As Worksheet
Dim invCol As Integer
Dim invRow As Integer

invRow = 8
invCol = 6 'F column
startRow = 18 '18 is the first line of items
startCol = 2 'B

'get the invoice number
invNumber = CInt(ActiveWorkbook.Sheets("Invoice").Cells(invRow, invCol).Value)
'set the worksheet object
Set ws = ActiveWorkbook.Sheets("Invoice")
'copy after invoice
ws.Copy After:=ws

'update our invoice number
ws.Cells(invRow, invCol).Value = invNumber + 1
'make the worksheet active
ws.Activate
'clear out our cells with the product info
'clear the first line and delete the rest
Do While Trim(ws.Cells(startRow, startCol).Value) <> ""
    If startRow = 18 Then
        ws.Cells(startRow, startCol).EntireRow.ClearContents
    Else
        ws.Cells(startRow, startCol).EntireRow.Delete shift:=Excel.xlShiftUp
        'reset the row
        startRow = startRow - 1
    End If
    'move to the next row
    startRow = startRow + 1
Loop

'release the worksheet object
Set ws = Nothing


End Sub

【讨论】:

    【解决方案2】:

    我认为在你拥有一个可用的系统之前你还有很长的路要走,但这里有一个例子来说明如何按照你的要求去做。请注意,其中很多都是非常手动的(所有Range 的东西),这使得它很危险——如果你重新排列工作表上的东西,你将不得不相应地修改代码。我强烈推荐 Access 来完成这样的任务,它非常值得学习曲线。另外,我没有在下面做,但您可能想更改新工作表的名称。

    Public Sub NewInvoice()
        Dim wksht As Worksheet
        Dim newwksht As Worksheet
    
        'Copy the Invoice worksheet
        Set wksht = ActiveWorkbook.Sheets("Invoice")
        wksht.Copy after:=wksht
    
        'The new worksheet is active, get a reference to it
        Set newwksht = ActiveSheet
    
        With newwksht
            'Clear all the input cells
    
            'Customer Info
            .Range("C7:C13").Value = ""
    
            'Company/Date
            .Range("F7").Value = ""
            .Range("F8").Value = .Range("F8").Value + 1 'Increment Invoice Number
            .Range("F9").Value = ""
    
            'Upper left Product # all the way to the lower right Line Total, however many there might be.
            .Range(.Range("B18"), .Range("B18").End(xlDown).End(xlToRight)).Value = ""
        End With
    End Sub
    

    【讨论】:

    • 谢谢 Blackhawk :) 虽然,我在这一行收到了一个错误:.Range("F8").Value = .Range("F8").Value + 1 'Increment Invoice Number。知道为什么吗?
    • 想通了。不喜欢与代码在同一行的注释。不过,似乎要从这些单元格中删除我的所有公式。有没有办法解决这个问题?
    • 看看我的问题将是你的答案;)你在这里想了很多。 oyu 想要的非常简单,只是哪些单元格不包含公式,因为这些是唯一需要清除的单元格。所有其他单元格都使用查找,因此我们不需要触摸它们。发票号码也可以查找吗?
    • @Sorceri - 在我的示例图像中,所有带有红色透明框的单元格(除了几个)都包含诸如SUMVLOOKUP 之类的公式,它们是需要的被重置。 Invoice Number 只是直接输入单元格的数字。
    • @Sorceri - Record Macro 会是这个问题的最佳答案吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多