簡體   English   中英

VBA 每次單擊宏按鈕時,將用戶表單中的新行和數據插入到另一個工作表中

[英]VBA Insert new row and data from user form into another sheet table each time clicks macro button

我有一個手動制作的表單(文本字段),它使用 vlookup 根據鍵入的唯一 ID 返回這些字段對應的值。 示例:ID:0001(靜態數字) 類型:vlookup value1 價格:vlookup value 2 所有者:vlookp value 3 還有另一個表,每次只需要將該 ID 插入到名為“ID”的第一個表行中,示例:row1“ ID”,其他列行通過 vlookup 調用公式返回。

但我需要的是,每次我在表單 Id 字段中鍵入新值(來自表 1 的表單),然后我點擊插入宏按鈕; VBA 將用戶鍵入的“id”與表“ID”列行(sheet2)中找到的 id 進行比較,如果未找到鍵入的 ID; 插入與上述格式相同的新行,並將新 ID 插入該新行的第一行; 還要檢查表中的另一行值(稱為:Type,單獨放在單獨的行中)並與另一個用戶表單字段(稱為:Type)值(來自工作表 1,就像 ID 內容一樣......)比較,如果它是不同的值然后復制相同的行格式並粘貼新類型字段的值,然后執行第一步並在“新”類型“行下方的新行中插入 ID。實際上我是從該代碼開始的,但它沒有檢查或粘貼如果我使用Paste:=xlPasteFormats, Operation:=xlDown則第一行下方的新行或給出錯誤。

Sub add_item()
'
' add_item Macro
'

'
  Sheets("AJOUTER_PV").Select
  Range("K6").Select
    Selection.Copy
    Sheets("Inventaire").Select
    Range("A5502").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
  If Sheets("AJOUTER_PV").Range("K6").value <> Sheets("Inventaire").Range("A5502").value Then
  
   Range("A5577:AF5577").Select
    Selection.EntireRow.Insert , CopyOrigin:=xlFormatFromLeftOrAbove
    Range("A5502").Select
    ActiveWindow.SmallScroll ToRight:=3
    Range("A5502:AL5502").Select
    Selection.Copy
   
    Range("A5577:AL5577").PasteSpecial Paste:=xlPasteFormats, Operation:=xlDown

    Application.CutCopyMode = False
    End If
End Sub

*其中 Range("K6") 是用戶表單中的 Id 字段。
Range("A5502") 是表中的 ID 字段,其中 ID 將首先插入到“A5502”中,然后是“A5503”等。
**在表的每一行之前,有“類型”行(在一個單獨的合並到一個單元格行中),在這里我們需要檢查用戶和表的類型以了解我們是否需要插入新的類型行使用來自用戶表單的新數據,然后使用來自用戶表單的“ID”值插入新行與使用“ID”引用的預制 vlookup 自動完成行的 ID 行相同的格式(+ 公式)。 表格

也許有些答案總比沒有答案好。 如果不是我道歉。

Option Explicit

Sub Add_Item()

    ' declare all variables
    Dim WsPV        As Worksheet                ' Sheets("AJOUTER_PV")
    Dim WsInv       As Worksheet                ' Sheets("Inventaire")
    Dim Id          As Variant                  ' referenced ID
    
    ' assign values / objects to the declared variables
    Set WsPV = Worksheets("AJOUTER_PV")
    Set WsInv = Worksheets("Inventaire")
    
    ' use the Cells collection to address cells
    ' syntax is Cells([Row number], [Column number or name])
    Id = WsPV.Cells(6, "K").Value
    WsInv.Cells(5502, "A").Value = Id
    ' you could also use:- WsInv.Cells(5502, "A").Value = WsPV.Cells(6, "K").Value
    
    '  What 's this? You just made A5502 = K6!
    ' If Sheets("AJOUTER_PV").Range("K6").Value <> Sheets("Inventaire").Range("A5502").Value Then
  
    ' not clear what you intend, either from your code or you text
    ' so, here is some syntax you might adapt
    WsPV.Rows(5577).EntireRow.Insert CopyOrigin:=xlFormatFromLeftOrAbove
    WsPV.Range("A5502:AL5502").Copy Destination:=WsInv.Cells(5502, "B")
    Application.CutCopyMode = False
End Sub

上面的突出信息是你不需要Select任何東西。 相反,您應該處理對象(工作表、范圍、單元格)並修改它們的屬性(此處僅涉及它們的Value屬性)。 為了解決這些問題,您應該聲明變量並為它們分配值和對象。 為了不遺漏任何人,您應該在代碼表的頂部指定Option Explicit

更新版本的代碼(重建表“Inventaire”所以實際單元格就像更新代碼中一樣......但是這個代碼的問題實際上我不需要一個單元格與另一個單元格保持相等但需要一系列復制粘貼每個執行代碼時在“CBR”列下方的新行中的時間。

Option Explicit

Sub Add_Item()

    ' declare all variables
    Dim WsPV        As Worksheet                ' Sheets("AJOUTER_PV")
    Dim WsInv       As Worksheet                ' Sheets("Inventaire")
    Dim Id          As Variant                  ' referenced CBR
    
    ' assign values / objects to the declared variables
    Set WsPV = Worksheets("AJOUTER_PV")
    Set WsInv = Worksheets("Inventaire")
    
    ' use the Cells collection to address cells
    ' syntax is Cells([Row number], [Column number or name])
    Id = WsPV.Cells(6, "K").Value
    WsInv.Cells(4, "A").Value = Id
    ' you could also use:- WsInv.Cells(5502, "A").Value = WsPV.Cells(6, "K").Value
    
    '  What 's this? You just made A5502 = K6!
     If Sheets("AJOUTER_PV").Range("K6").Value <> Sheets("Inventaire").Range("A4").Value Then
   WsPV.Rows(5).EntireRow.Insert Shift:=xlDown
    WsPV.Rows(5).EntireRow.Insert CopyOrigin:=xlFormatFromLeftOrAbove
    ElseIf Sheets("AJOUTER_PV").Range("K6").Value = Sheets("Inventaire").Range("A4").Value Then
    ' not clear what you intend, either from your code or you text
    ' so, here is some syntax you might adapt
   
    
    WsInv.Range("A4:H4").Copy Destination:=WsInv.Cells(5, "A")
    Application.CutCopyMode = False
    End If
End Sub

所以在添加新行之前,這段代碼總是將相同的值復制到第一行,然后將新值添加到第二行,這總是只給出 2 行和重復數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM