使用 VBA 将固定值添加到单元格区域

问题描述 投票:0回答:2

我正在尝试根据单元格的值直接填充选定范围内的值到单元格的左侧。

在任何给定范围内都会有一组有效日期。我想选择日期右侧的空白单元格,然后宏应显示财政年度和季度。

例如
A1=“2022年12月20日”,A2=“2023年8月15日”
应该给:
B1 =“2022-23 Q3”,B2 =“2023-24 Q2”

当我选择单元格 B1 并使用:

ActiveCell.Value = "=IF(MONTH(RC[-1])<4,YEAR(RC[-1])-1&""-""&RIGHT(YEAR(RC[-1]),2)&"" Q4"",IF(MONTH(RC[-1])<7,YEAR(RC[-1])&""-""&RIGHT(YEAR(RC[-1]),2)+1&"" Q1"",IF(MONTH(RC[-1])<10,YEAR(RC[-1])&""-""&RIGHT(YEAR(RC[-1]),2)+1&"" Q2"",IF(MONTH(RC[-1])<13,YEAR(RC[-1])&""-""&RIGHT(YEAR(RC[-1]),2)+1&"" Q3""))))"

它将正确的解决方案分配给活动单元格。

问题 1:如果我选择单元格 B1:B5,我希望宏为这些单元格分配相同的公式。

无论我尝试什么,都只会填充第一个单元格。

我知道我可以双击单元格的右下角,它将填充,但我想通过一次点击而不是两次来实现它。

问题 2:如果我突出显示了单元格 H7:H20(数据位于 G7:G20 中),那么让宏起作用,所以基本上我可以单击电子表格上的任何范围,它会根据 的值填充该范围直接在其左侧的单元格。

最终结果适用于单个单元格,并将公式放入单元格中,单元格显示正确的文本,但如果结果只是纯文本,那就没问题了。


我找到了解决方案:

Dim rng As Range
For Each rng In Selection
    rng.Offset(0, 1).Value = "=IF(MONTH(RC[-1])<4,YEAR(RC[-1])-1&""-""&RIGHT(YEAR(RC[-1]),2)&"" Q4"",IF(MONTH(RC[-1])<7,YEAR(RC[-1])&""-""&RIGHT(YEAR(RC[-1]),2)+1&"" Q1"",IF(MONTH(RC[-1])<10,YEAR(RC[-1])&""-""&RIGHT(YEAR(RC[-1]),2)+1&"" Q2"",IF(MONTH(RC[-1])<13,YEAR(RC[-1])&""-""&RIGHT(YEAR(RC[-1]),2)+1&"" Q3""))))"
Next rng
excel vba assign
2个回答
1
投票

您必须使用 Worksheet_SelectionChange 事件和代表所选单元格的目标范围。

此外,我建议添加一个单独的子程序来插入公式。

这必须进入工作表类模块

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
addFQFormula Target
End Sub

这可以放在普通模块中:


Public Sub addFQFormula(rg As Range)
If Not IsDate(rg.Offset(, -1).Cells(1, 1)) Then
    MsgBox "No valid date in cell " & rg.Offset(, -1).Cells(1, 1).Address, vbCritical
Else
    rg.Formula2R1C1 = "= YEAR(RC[-1])+(MONTH(RC[-1])>=4) - 1 & ""-"" & YEAR(RC[-1])+(MONTH(RC[-1])>=4) & "" Q"" &   CHOOSE(MONTH(RC[-1]),4,4,4,1,1,1,2,2,2,3,3,3)"
End If
End Sub

(财政年度逻辑来自:https://exceljet.net/formulas/get-fiscal-year-from-date

就像您可以从任何工作表中调用子程序一样。

我检查了至少左边的第一个值必须是日期。

但是要小心这种方法 - 因为整个选定的范围都会被覆盖


0
投票

很确定 2016 年没有

LET
和更新的配方。

这个公式可以解决问题:

=IF(CHOOSE(ROUNDUP(MONTH(RC[-1])/3,0),4,1,2,3)=4,TEXT(EDATE(RC[-1],-12),"yyyy-") & TEXT(RC[-1],"yy"),TEXT(RC[-1],"yyyy-") & TEXT(EDATE(RC[-1],12),"yy")) & TEXT(CHOOSE(ROUNDUP(MONTH(RC[-1])/3,0),4,1,2,3)," Q0")  

© www.soinside.com 2019 - 2024. All rights reserved.