Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Excel VBA搜索列标题,如果标题不存在,则插入新列_Excel_Vba - Fatal编程技术网

使用Excel VBA搜索列标题,如果标题不存在,则插入新列

使用Excel VBA搜索列标题,如果标题不存在,则插入新列,excel,vba,Excel,Vba,我有一个定期更新的电子表格。用户将使用容器类型(这是标题名称)和数量更新图纸(创建)上的两列,这两列将传输到图纸(跟踪)。我试图找出如何搜索sheet2(跟踪现有标题(容器类型),如果找到,则该列中的数量将更新为下一行的可用数量。如果未找到标题,则会在右侧添加一个新列,其中包含新标题名称,并更新数量。 我确实找到了一些很好的例子,比如下面。但是我不知道如何应用它。也许有一种方法可以循环它来搜索标题 Sub TrackR() Dim cl As Range For Each cl

我有一个定期更新的电子表格。用户将使用容器类型(这是标题名称)和数量更新图纸(创建)上的两列,这两列将传输到图纸(跟踪)。我试图找出如何搜索sheet2(跟踪现有标题(容器类型),如果找到,则该列中的数量将更新为下一行的可用数量。如果未找到标题,则会在右侧添加一个新列,其中包含新标题名称,并更新数量。

我确实找到了一些很好的例子,比如下面。但是我不知道如何应用它。也许有一种方法可以循环它来搜索标题

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中,我如何跳过空白单元格以达到具有值的单元格并更新跟踪?