【问题标题】:Autofill unknown amount of cells自动填充未知数量的单元格
【发布时间】:2018-10-23 21:48:58
【问题描述】:

我正在尝试编写相当于单击并将单元格的角拖动到末尾的 VBA 代码。插图:

我尝试了几种我在网上找到的不同建议,但总是遇到错误。

下面是我目前正在研究的生产线。但我收到运行时错误“1004”:应用程序定义或对象定义错误

Range("A4").Select
ActiveCell.AutoFill Range(ActiveCell, ActiveCell.Offset(0, 1).End(xlRight).Offset(0, -1))

有关更多上下文,这里是我正在处理的整个脚本:整个脚本的屏幕截图:
这是根据我自己的逻辑在我开始在线寻找答案之前的原始脚本行:

Selection.Autofill Destination:=Range("A4":mylastcell_4), Type:=xlFillDefault

mylastcell_4 已在脚本顶部声明(请参阅整个脚本的屏幕截图)。我也尝试更改为"A4",mylastcell_4,但仍然收到错误消息。

我对 VBA 非常陌生,不知道从哪里开始。

我试过了

 .Range(.Cells(4, "A"), .Cells(1, .Columns.Count).End(xlToLeft).Offset(3, 0)).Formula = "=concatenate(a2, a1, a3)"

以下答案之一建议了这一点。但是,如果我在第 1 行中有 5 个单元格,这只会给出结果。我需要更大的灵活性,因为可能有 2 个值到 500 个值可供使用。 Image of results of above suggested script

我还发现,沿着这条路线走似乎会破坏我知道单独工作的下一批串联 - 希望它是需要改变的简单的东西? Script used for next concatenation

本练习的最终目标是获取准备好直接进入 SQL 的文本列表。即 a b c d e 变成 'a','b','c','d','e' 都在一个单元格中。

【问题讨论】:

    标签: excel autofill


    【解决方案1】:

    你要添加的内容就是这个公式放在A4中。

    =concatenate(a2, a1, a3)
    

    由于前面的所有三行对公式都很重要,因此推断前面的任何行都可以用作右侧的“停止”点。我将使用第 1 行(上面 3 行)并向下偏移来定位“停止”点。

    with worksheets("sheet1")
        ...
        .cells(4, "A").formula = "=concatenate(a2, a1, a3)"
        .range(.cells(4, "A"), .cells(1, .columns.count).end(xltoleft).offset(3, 0)).fillright
        ...
    end with
    

    我更喜欢 .FillRight 进行此操作而不是 .AutoFill,但您也可以轻松地将此方法用于 .AutoFill。

    或者,您可以一次将公式写入所有四个单元格。

    with worksheets("sheet1")
        ...
        .range(.cells(4, "A"), .cells(1, .columns.count).end(xltoleft).offset(3, 0)).formula = "=concatenate(a2, a1, a3)"
        ...
    end with
    

    您需要在每个 Range 和 Cells 前面加上 .,例如 .Range(...).Cells(...),以便您的 with worksheets("sheet1") 正常工作。

    在您自己的版本中,如果 mylastcell_4 设置正确,那么这很可能已经解决了问题。

    .Range("A4").Autofill Destination:=.Range("A4:" & mylastcell_4.address), Type:=xlFillDefault
    

    您设置了一个 With Worksheet ... End With 块然后似乎从未使用它。

    【讨论】:

    • 感谢您的帮助。我已经使用了您建议的第二个代码,但我发现这仅针对 4 个单元格进行了硬编码,因为我需要它一直到最后,可能是 4 个单元格,也可能是 400 个单元格。
    • 不,它是硬编码的第四行,而不是四个单元格。 .cells(4, "A") 是 A4。 .range(.cells(4, "A"), .cells(1, .columns.count).end(xltoleft).offset(3, 0)) 从 A4 开始,直到第 1 行有单元格为止。
    • 嗯,这很奇怪。我刚刚用我的图像添加了这个问题,当我这样做时会出现什么。
    • 那是因为 F2:H3 是空白的。您正在连接零长度字符串(即 nothing),因此这些行不会显示任何内容。
    • 因此这条线不起作用然后 Range("A3").Select Range(Selection, Selection.End(xlToLeft)).Select Selection.FormulaArray = "'',"
    【解决方案2】:

    VBA 中范围的逻辑遵循以下结构:

    Range(A1:D1) -> Range(Cells(A1), Cells(D1)) -> 
    
    Range(Cells(row number, column number), Cells(row number, column number)) -> 
    
    Range(Cells(1, 1), Cells(1, 4)) ... And then you can replace 1,1 & 1,4 with variables..
    

    也许这可行,但我认为您的范围可能需要修改/澄清。不清楚您要实现什么(您希望代码做什么,您的预期结果是什么)..,但这可能值得一试:

    ActiveCell.AutoFill Destination:=Range(ActiveCell, ActiveCell.Offset(0, 1).End(xlRight).Offset(0, -1))
    

    我想鼓励你,继续学习 VBA :)!!!

    【讨论】:

    • 您好 Wizhi 我已经尝试更改您的脚本,但它得到的错误与我之前得到的相同。我已经添加到问题中以展示我最初的尝试以及我试图为这句话实现的目标的图片。还有什么可以帮助你们帮助我?感谢您的鼓励 :) 在我正常的 Stackoverflow 角落里,每当您提出问题时,总会有一个特定的人通过并编辑您问题中的小事,这让您感觉自己像个白痴,因为他们经常这样做,所以很好不在这里看到它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-05
    • 2015-09-09
    • 2017-05-01
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多