使用Excel VBA搜索列标题,如果标题不存在,则插入新列
我有一个定期更新的电子表格。用户将使用容器类型(这是标题名称)和数量更新图纸(创建)上的两列,这两列将传输到图纸(跟踪)。我试图找出如何搜索sheet2(跟踪现有标题(容器类型),如果找到,则该列中的数量将更新为下一行的可用数量。如果未找到标题,则会在右侧添加一个新列,其中包含新标题名称,并更新数量。 我确实找到了一些很好的例子,比如下面。但是我不知道如何应用它。也许有一种方法可以循环它来搜索标题使用Excel VBA搜索列标题,如果标题不存在,则插入新列,excel,vba,Excel,Vba,我有一个定期更新的电子表格。用户将使用容器类型(这是标题名称)和数量更新图纸(创建)上的两列,这两列将传输到图纸(跟踪)。我试图找出如何搜索sheet2(跟踪现有标题(容器类型),如果找到,则该列中的数量将更新为下一行的可用数量。如果未找到标题,则会在右侧添加一个新列,其中包含新标题名称,并更新数量。 我确实找到了一些很好的例子,比如下面。但是我不知道如何应用它。也许有一种方法可以循环它来搜索标题 Sub TrackR() Dim cl As Range For Each cl
Sub TrackR()
Dim cl As Range
For Each cl In Range("1:1")
If cl = sheets(“Create”).range(“J11:J36”) Then
cl.EntireColumn.Insert Shift:=xlToRight
End If
cl.Offset(0, 1) = "New Conatainer Name"
Next cl
Application.ScreenUpdating = False
Sheets("Tracking").Range("A" & Rows.Count).End(xlUp).Offset(1, 0) = Date
'Trailer No.
Sheets("Create").Range("L8").Copy
Sheets("Tracking").Range("B" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
'total container qty
Sheets("Create").Range("G43").Copy
Sheets("Tracking").Range("D" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
'Supplier
Sheets("Create").Range("K4").Copy
Sheets("Tracking").Range("C" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
'quantities
Sheets("Create").Range("L11").Copy
Sheets("Tracking").Range("E" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
Sheets("Create").Range("L12").Copy
Sheets("Tracking").Range("F" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
Sheets("Create").Range("L13").Copy
Sheets("Tracking").Range("G" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
Sheets("Create").Range("L14").Copy
Sheets("Tracking").Range("H" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
Sheets("Create").Range("L15").Copy
Sheets("Tracking").Range("I" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
Application.ScreenUpdating = False
End Sub
未经测试,但类似的方法应该有效:
Sub TrackR()
Dim wsTrack As Worksheet, wsCreate As Worksheet, cont, qty, h As Range
Dim c As Range, m, rw As Range, rngHeaders As Range, col As Long
Set wsCreate = ThisWorkbook.Worksheets("Create")
Set wsTrack = ThisWorkbook.Worksheets("Track")
'get the next empty row on the Tracking sheet
Set rw = wsTrack.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).EntireRow
'fill in the common cells in the row
rw.Cells(1).Value = Date
rw.Cells(2).Value = wsCreate.Range("L8").Value
rw.Cells(3).Value = wsCreate.Range("K4").Value
rw.Cells(4).Value = wsCreate.Range("G43").Value
'now loop over the containers and add each one
Set rngHeaders = wsTrack.Cells(1, "E").Resize(1, 5000) 'or whatever would cover your data
For Each c In wsCreate.Range("J11:J36").Cells
cont = c.Value
qty = c.Offset(0, 2).Value
If Len(cont) > 0 And Len(qty) > 0 Then
m = Application.Match(cont, rngHeaders, 0) 'any existing match ?
If IsError(m) Then
'no match - find the first empty cell and add the container
Set h = rngHeaders.Cells(rngHeaders.Cells.Count).End(xlToLeft).Offset(0, 1)
h.Value = cont
col = h.Column 'column number for the added header
Else
'matched: get the column number
col = rngHeaders.Cells(m).Column
End If
rw.Cells(col).Value = qty '<< add the quantity
End If
Next c
End Sub
Sub-TrackR()
Dim wsTrack As WORKEM,wsCreate As WORKEM,cont,qty,h As Range
尺寸c作为范围,m作为范围,rw作为范围,RNG作为范围,col作为长度
设置wsCreate=ThisWorkbook.Worksheets(“创建”)
设置wsTrack=ThisWorkbook.Worksheets(“跟踪”)
'获取跟踪表上的下一个空行
设置rw=wsTrack.Cells(Rows.Count,1)。End(xlUp)。Offset(1,0)。EntireRow
'填写行中的常用单元格
rw.单元格(1).值=日期
rw.Cells(2).Value=wsCreate.Range(“L8”).Value
rw.Cells(3.Value=wsCreate.Range(“K4”).Value
rw.Cells(4.Value=wsCreate.Range(“G43”).Value
'现在在容器上循环并添加每个容器
设置rngHeaders=wsTrack.Cells(1,“E”).Resize(1,5000)”或覆盖数据的任何内容
对于wsCreate.Range(“J11:J36”)单元格中的每个c
cont=c.值
数量=c.偏移量(0,2).值
如果Len(cont)>0且Len(qty)>0,则
m=Application.Match(cont,rngHeaders,0)'是否存在任何匹配?
如果IsError(m)那么
'不匹配-找到第一个空单元格并添加容器
设置h=rngHeaders.Cells(rngHeaders.Cells.Count).End(xlToLeft).Offset(0,1)
h、 值=续
col=h.Column'添加标题的列号
其他的
'匹配:获取列号
col=RNG标题。单元格(m)。列
如果结束
rw.Cells(col.Value=qty'不确定,请尝试此~
Sub TrackB()
Dim wsCreat As Worksheet: Set wsCreat = Sheets("Create")
Dim wsTracking As Worksheet: Set wsTracking = Sheets("Tracking")
Dim cl As Range, lastHCell As Range, header As Range, i As Integer, j As Integer,k as integer, str As Variant
With wsTracking
Set header = .[a1:xx1]: Set lastHCell = header.End(xlToRight)
iLstRow = .[a10000].End(xlUp).Offset(1, 0).Row
'Update default data [A:D]
.Range("A" & iLstRow) = Date
For Each str In Array("L8", "C4", "G43")
.Cells(iLstRow, i + 2) = wsCreat.Range(str): i = i + 1
Next
'add Column if not Match
For Each cl In wsCreat.[B11:B37, E11:E37]
Dim k: k = Application.Match(cl, header, 0)
If IsError(k) And cl <> vbNullString Then _
lastHCell.Offset(0, 1).EntireColumn.Insert Shift:=xlToRight, CopyOrigin:=True: _
Set lastHCell = lastHCell.Offset(0, 1): lastHCell.Value2 = cl
Next cl
'Update input Data
i = 5
Dim arr As Variant: arr = Array("B11:B37", "E11:E37")
Dim arrResult As Variant: arrResult = Array("C10" , "F10")
Dim cell As Range: k = 0
For k = 0 To UBound(arr)
j=1
For Each cell In wsCreat.Range(arr(k)).Cells
If cell.Value2 <> vbNullString Then
.Cells(iLstRow, Application.Match(cell, header, 0)) = wsCreat.Range(arrResult(k)).Offset(j, 0)
End If
j = j + 1
Next cell
Next
End With
End Sub
Sub-TrackB()
将wsCreat设置为工作表:设置wsCreat=工作表(“创建”)
尺寸wsTracking作为工作表:设置wsTracking=工作表(“跟踪”)
Dim cl作为范围,lastHCell作为范围,header作为范围,i作为整数,j作为整数,k作为整数,str作为变量
带跟踪
Set header=[a1:xx1]:Set lastHCell=header.End(xlToRight)
iLstRow=[a10000]。结束(xlUp)。偏移量(1,0)。行
'更新默认数据[A:D]
.范围(“A”&iLstRow)=日期
对于数组中的每个str(“L8”、“C4”、“G43”)
.Cells(iLstRow,i+2)=wsCreat.Range(str):i=i+1
下一个
'如果不匹配,则添加列
对于wsCreat中的每个cl。[B11:B37,E11:E37]
尺寸k:k=应用程序匹配(cl,标题,0)
如果IsError(k)和cl vbNullString,则_
lastHCell.Offset(0,1).EntireColumn.Insert移位:=xlToRight,CopyOrigin:=True:_
设置lastHCell=lastHCell.Offset(0,1):lastHCell.Value2=cl
下一个cl
'更新输入数据
i=5
Dim arr作为变量:arr=阵列(“B11:B37”、“E11:E37”)
Dim arrResult作为变量:arrResult=数组(“C10”、“F10”)
变暗单元格作为范围:k=0
对于k=0至UBound(arr)
j=1
对于wsCreat.Range(arr(k))单元格中的每个单元格
如果cell.Value2 vbNullString,则
.Cells(iLstRow,Application.Match(cell,header,0))=wsCreat.Range(arresult(k)).Offset(j,0)
如果结束
j=j+1
下一个细胞
下一个
以
端接头
您可以使用一个公式来确定集装箱是否已经存在于跟踪表中(即:VLookUp
,Match
…),您的意思是这样=VLookUp(E1:Z1,Create!J11:L16,3,FALSE)?用户将定期插入不同的容器,然后选择一个命令按钮来更新下一行中给定日期容器的数量。我如何让它为不存在的容器添加一列w/标题?请为循环生成2个数组字符串。代码重叠太多。这非常有效。我如何才能获得t匹配或搜索两个范围,例如:wsCreat中的每个cl。[J11:J36]和[F11:F36]?您好。让我们尝试:用于wsCreat中的每个cl。[J11:J36,F11:F36]
我收到“更新输入数据”的“不匹配类型”错误。单元格(iLstRow,Application.match(wsCreat。[C10,F10]。偏移量(j,0),标头,0))=wsCreat。[l10]。偏移量(j,0)'我更新了一点,希望代码能正常工作。请选择正确的区域([J10,F10]或[C10,F10])好的,最后一个问题,如果区域J10或F10有空格,换句话说,如果没有数据(数量),该怎么办在一个单元格中,直到在范围内进一步下降,例如:数量位于J25中,我如何跳过空白单元格以达到具有值的单元格并更新跟踪?