Excel 如何在不覆盖内容的情况下向下复制单元格';它在下面吗?

Excel 如何在不覆盖内容的情况下向下复制单元格';它在下面吗?,excel,vba,Excel,Vba,如果您无法查看dropbox,则这是工作表。 这是工作簿。我想做的是在显示3M的地方,将公司名称复制到A列显示总计的地方,然后对下一家公司做同样的操作 如何在Excel VBA中执行此操作?我知道我可以使用最后一行,但我相信这并不是最好的方法,因为原始版本将有300多家不同的公司 这是我现在使用的原始代码。没有添加额外的位 选项显式 Sub Import() Dim lastrow As Long Dim wsIMP As Worksheet 'Import Dim

如果您无法查看dropbox,则这是工作表。

这是工作簿。我想做的是在显示3M的地方,将公司名称复制到A列显示总计的地方,然后对下一家公司做同样的操作

如何在Excel VBA中执行此操作?我知道我可以使用最后一行,但我相信这并不是最好的方法,因为原始版本将有300多家不同的公司

这是我现在使用的原始代码。没有添加额外的位

选项显式

Sub Import()

    Dim lastrow As Long
    Dim wsIMP As Worksheet 'Import
    Dim wsTOT As Worksheet 'Total
    Dim wsSHI As Worksheet 'Shipped
    Dim wsEST As Worksheet 'Estimate
    Dim wsISS As Worksheet 'Issued
    Dim Shift As Range


    Set wsIMP = Sheets("Import")
    Set wsTOT = Sheets("Total")
    Set wsSHI = Sheets("Shipped")
    Set wsEST = Sheets("Estimate")
    Set wsISS = Sheets("Issued")

    With wsIMP

        wsIMP.Range("E6").Cut wsIMP.Range("E5")
        wsIMP.Range("B7:G7").Delete xlShiftUp

End Sub

马特,几个月前我有一个很好的功能,但是我忘了复制到我的图书馆。然而,我已经做了一个很好的模型,我以前有。(出于某种原因,我用它来填写数据透视表中的条目)

不管怎样,给你。您可能需要调整它以满足您的确切需求,我并不是说目前它不容易出现任何错误,但这应该是一个很好的开始

编辑=我已经更新了我的代码帖子,以集成到您的代码帖子中,从而使您更轻松

    Sub Import()

    Dim lastrow As Long
    Dim wsIMP As Worksheet, wsTOT As Worksheet 'Total
    Dim wsSHI As Worksheet, wsEST As Worksheet 'Estimate
    Dim wsISS As Worksheet, Shift As Range


    Set wsIMP = Sheets("Import")
    Set wsTOT = Sheets("Total")
    Set wsSHI = Sheets("Shipped")
    Set wsEST = Sheets("Estimate")
    Set wsISS = Sheets("Issued")

    With wsIMP

        .Range("E6").Cut .Range("E5")
        .Range("B7:G7").Delete xlShiftUp

        Call FillDown(.Range("A1"), "B")

        '-> more code here

    End With


End Sub

Sub FillDown(begRng As Range, col As String)

Dim rowLast As Long, rngStart As Range, rngEnd As Range

rowLast = Range(col & Rows.Count).End(xlUp).Row
Set rngStart = begRng

Do

    If rngStart.End(xlDown).Row < rowLast Then
        Set rngEnd = rngStart.End(xlDown).Offset(-1)
    Else
        Set rngEnd = Cells(rowLast, rngStart.Column)
    End If

    Range(rngStart, rngEnd).FillDown
    Set rngStart = rngStart.End(xlDown)

Loop Until rngStart.Row = rowLast


End Sub

enter code here
子导入()
最后一排一样长
将wsIMP作为工作表,wsTOT作为工作表的总计
将wsSHI作为工作表,wsEST作为工作表的估算
将wsISS作为工作表调暗,将Shift作为范围
设置wsIMP=图纸(“导入”)
设置wsTOT=张数(“总计”)
设置wsSHI=板材(“已装运”)
设置wsEST=工作表(“估算”)
设置wsISS=工作表(“已发布”)
与wsIMP
.量程(“E6”).切割量程(“E5”)
.范围(“B7:G7”).删除xlShiftUp
调用填充(.Range(“A1”),“B”)
'->这里有更多代码
以
端接头
子填充(开始作为范围,列作为字符串)
变暗最后一行长度,RNG起始范围,rngEnd范围
rowLast=范围(列和行.计数).结束(xlUp).行
设置rngStart=begRng
做
如果rngStart.End(xlDown).Row
只要没有您不想覆盖的公式

编辑-更新为基于B列末尾设置原始范围

Sub Macro1()
    Dim sht as WorkSheet

    Set sht = ActiveSheet

    With sht.Range(sht.Range("A7"), _
                   sht.Cells(Rows.Count, 2).End(xlUp).Offset(0, -1))

        .SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=R[-1]C"
        .Value = .Value

    End With    
End Sub

马特,你说它在哪里显示总数。3M的那一排是哪一排。5还是6?A7中应该是什么?
在A列中显示总计
在A列中不显示总计。但是如果我能猜出您的意思,请尝试VBA中的
倒填
方法。您可以在列表中向后循环,并将您的
填充范围设置为仅与列B匹配的适当行。。。我的意思是A栏的3米将被压缩到5米。然后5个智慧将被复制到下一个公司,等等…是的,非常好。请参阅
Range.FillDown
和我关于循环的第一条评论。我不想问这个问题,但怎么问呢?我一直在网上寻找关于如何使用FillDown的解释,但似乎每个人以及他们的母亲似乎都有一个关于如何使其工作的答案,而没有实际展示如何使其工作……Matt,你现在在OP中输入的代码似乎与你的问题无关。它所做的只是剪切一些数据并删除一些行。我可以看到,在该代码中,您缺少一个
End With
语句,这肯定会导致错误!但是,我不知道你得到了什么错误,因为你没有指定。是的,我显示了需要显示的内容,另一位有价格、运输信息、地址、日期等,不能公开。。这就是剩下的代码所要处理的,它是用来格式化的。我知道这就是你出错的地方。问题是如何调试它?我知道错误很可能是由“坏”范围引起的,因此请查看
范围(rngStart,rngEnd)
的实际范围,这将告诉您问题所在。我怀疑它没有根据您的数据设置和代码编写方式正确填充。但问题不在这里。我需要把这个放在A7上才能让它工作,还是这不现实?我刚刚又下载了你的链接。。。看看这个。。。数据集的结构已更改!!!马特,在这一点上发现这一点非常令人沮丧!特别是当我提到您可能需要调整代码以使您的特定数据集能够使用它时。只需将引用从
.Range(“A1”)
更改为要开始的实际位置,即现在的
.Range(“A7”)
,因此子部分中的第一个参数将调用要开始填充的单元格,而不仅仅是要在工作表上开始的列。没有公式,只有公司名称。。。如图所示。。。我想这对我来说是行不通的。好主意。。。因为据我所知,只有当你有一个小部分要编辑时,这才有效。。。不是像我这样的几个分组。列总是一样的,填充单元格的范围总是每个月都会改变。在你的脚本中,我看不到任何东西会将A列中的第一个内容复制下来,使用B列作为参考,直到B列的末尾结束。。。然后再次循环。。。这有意义吗?马特,你的问题没有提到B栏,也没有任何关于A栏中“总计”位置的指示。想补充一点细节吗?基本上,我需要A栏中的名称复制到B栏的末尾,然后在出现新名称时重复,重复并冲洗。这最终将被更改为另一个列以供参考,但由于NDAs等原因,这是我所能显示的全部内容。该公司的“B列结尾”,还是B列所有内容的结尾?使用“之后”屏幕截图更新您的问题可能会有所帮助。感觉我们在这里工作的目的不同。