我有一个工作表,其中包含各种数据,以及同一行上包含月份 X、Y、Z 等的两个列范围,一个用于支出成本,一个用于已开具发票的成本。
我已经编写了代码,可以使用输入硬数据所需的格式复制另一个工作表。
我还需要在第一个月列的右侧输入两列,以便根据需要输入新的月份。
我在主代码中开始并第一次工作。
Sheets("Cost").Range("K:K").EntireColumn.Insert
Sheets("Cost").Range("O:O").EntireColumn.Insert
但是,下次我生成月份时,范围已更改,VBA 代码将新列放置在错误的位置。
如何动态更新两个位置的范围?
您可以通过搜索行中的值(可能是固定值)或通过输入框或通过使用在搜索值后添加列的代码进行选择来实现 如果您添加一张简单数据的照片可能会更容易找到更好的方法
count = 0
Add = False
For Each cell In Sheets("Cost").Range("1:1")
If Add Then
cell.EntireColumn.Insert
Add = False
Count = Count + 1
End If
If cell.Value = "value to search" Then
Add = True
'MsgBox cell.Address
End If
If Count = 2 Then
Exit For
End If
Next cell
插入第一列时,列(从 K 列到右侧)将向右移动。也就是说,
Columns("O")
在P列上。那么第二次插入是错误的。
插入和删除都要从末尾开始执行。
Sheets("Cost").Columns("O").Insert
Sheets("Cost").Columns("K").Insert
Columns("O")
相当于Range("K:K").EntireColumn
问题:但是,下次我生成一个月时,显然范围已更改,并且 vba 将新列放置在错误的位置。
Sub demo()
Dim c As Range
Const KEY = "Col11"
Set c = Sheets("Cost").Rows(1).Find(KEY, LookIn:=xlValues, lookat:=xlWhole)
If c Is Nothing Then
MsgBox "Can't find " & KEY
Else
c.EntireColumn.Insert
End If
End Sub
另一个想法是,它需要位于第一个移位之前的列中的三个单元格来存储列名称和移位次数,因为它将影响第二列的位置,即通过使用 2 个函数 asc() 和 chr() 如下
我使用了A1,A2,A3,您可以使用任何工作表中的任何其他单元格
If Range("a1").Value = "" And Range("a2").Value = "" Then
Sheets("Cost").Columns("O").Insert
Sheets("Cost").Columns("K").Insert
Range("a1").Value = "K"
Range("a2").Value = "O"
Range("a3").Value = 1
Else
Sheets("Cost").Columns(Chr(Asc(Range("a1").Value) + 1)).Insert
Range("a1").Value = Chr(Asc(Range("a1").Value) + 1)
Range("a3").Value = Range("a3").Value + 1
Sheets("Cost").Columns(Chr(Asc(Range("a2").Value) + 1 + Range("a3").Value)).Insert
Range("a2").Value = Chr(Asc(Range("a2").Value) + 1)
End If
End Sub