根据单元格值在 Excel 中创建自动形状

根据单元格值在 Excel 中创建自动形状

我正在尝试创建(也许我根本不应该使用 Excel)一个在 Excel 中显示甘特图样式的日历。我知道有专门为甘特图设计的软件。那不是我需要的。

我基本上要负责向我的老板提供这样的日历:

但我需要在其中显示开始日期、结束日期和里程碑。所以我的想法是,我可以让一个函数自动创建一个形状,然后自动填充该形状内的文本(事件名称等)。

如果这需要一些真正的编程知识,那也没关系。我并不担心学习 VBA,但我想在走这条路之前确保这是正确的道路。如果我应该使用 Excel 以外的其他软件,我也可以接受。

建议?意见?

答案1

这看起来就像 Outlook 日历可以做的事情。

但是,您所描述的是可行的。您将学习一些 VBA 编程。

其中一些看起来像这样,存放类似甘特图的条形图(尚无文字)...

Option Explicit
Sub main()
    Call InsertBar(0, 800)
End Sub
Sub InsertBar(LeftStart As Long, TotalWidth As Long)
Dim myWkSht As Worksheet
Dim myShp As Shape
Dim MaxWidth As Long, nBars As Long
Dim bDone As Boolean, iLoop As Long
Dim myStart() As Long, myWidth() As Long

If LeftStart < 0 Then Exit Sub
If TotalWidth <= 0 Then Exit Sub

Set myWkSht = Worksheets("Sheet2")
MaxWidth = myWkSht.Range("O1").Left
bDone = False
nBars = 1
ReDim myStart(1 To nBars)
ReDim myWidth(1 To nBars)
myStart(nBars) = LeftStart
myWidth(nBars) = TotalWidth
Do While Not bDone
    If myStart(nBars) + myWidth(nBars) < MaxWidth Then
        bDone = True
    Else
        nBars = nBars + 1
        ReDim Preserve myStart(1 To nBars)
        ReDim Preserve myWidth(1 To nBars)
        myStart(nBars) = 0
        myWidth(nBars - 1) = MaxWidth - myStart(nBars - 1)
        myWidth(nBars) = TotalWidth - myWidth(nBars - 1)
    End If
Loop
For iLoop = 1 To nBars
    With myWkSht
        Set myShp = .Shapes.AddShape(msoShapeRectangle, _
            myStart(iLoop), .Range("A10").Offset((iLoop - 1) * 6, 0).Top, _
            myWidth(iLoop), .Range("A10").Offset((iLoop - 1) * 6, 0).Height)
    End With
    With myShp
        .Fill.ForeColor.ObjectThemeColor = msoThemeColorBackground2
        .Fill.ForeColor.TintAndShade = 0
        .Fill.ForeColor.Brightness = 0
        .Fill.Transparency = 0
        .Fill.Solid

        .Line.ForeColor.ObjectThemeColor = msoThemeColorBackground2
        .Line.ForeColor.TintAndShade = 0
        .Line.ForeColor.Brightness = 0
        .Line.Transparency = 0
    End With
Next iLoop
End Sub

我开始的、基本的日历模型是这样的......

在此处输入图片描述

...运行示例代码后看起来像这样...

在此处输入图片描述

相关内容