簡體   English   中英

VBA僅將某些值的單元格從一張紙粘貼到另一張紙

[英]VBA to paste only certain values of cell from one sheet to another

有人可以幫我下面的代碼,我正在尋找的是,從表“ Form”中獲取2組Array中提到的某些單元格值。 第一組數組應向前復制到“ Tracker”工作表C3,而第二組數組應從第一組數組結束后的下一個單元格復制到EF3開始。

而現在,首先是從A3粘貼,然后是從A4粘貼。 如有任何問題,請通知我。

以下是我現在使用的代碼:

Sub AddEntry()

Dim LR As Long, i As Long, cls
Dim LR2 As Long, j As Long, cls2

cls = Array("C2", "C3", "G2", "G3", "C5", "C6", "C7", "C8", "C9", "C10", "C11", "C12", "C13", "A17", "C17", "D17", "F17", "G17", "H17", "A18", "C18", "D18", "F18", "G18", "H18", "A19", "C19", "D19", "F19", "G19", "H19", "A20", "C20", "D20", "F20", "G20", "H20", "A21", "C21", "D21", "F21", "G21", "H21", "A25", "B25", "C25", "D25", "E25", "F25", "G25", "H25", "A26", "B26", "C26", "D26", "E26", "F26", "G26", "H26", "A27", "B27", "C27", "D27", "E27", "F27", "G27", "H27", "A28", "B28", "C28", "D28", "E28", "F28", "G28", "H28", "A32", "C32", "E32", "G32", "H32", "A33", "C33", "E33", "G33", "H33", "A34", "C34", "E34", "G34", "H34", "A35", "C35", "E35", "G35", "H35", "A39", "D39", "F39", "A40", "D40", "F40", "A41", "D41", "F41", "A45", "C45", "E45", "G45", "A46", "C46", "E46", "G46", "A47", "C47", "E47", "G47", "D51", "D52", "D53", "D54", "D55", "D56", "D57", "D58", "D59", "D60", "D61", "D62", "D63", "D64", "D65", "D66", "D67")
With Sheets("Tracker")
    LR = WorksheetFunction.Max(3, .Range("C" & Rows.Count).End(xlUp).Row + 1)
    For i = LBound(cls) To UBound(cls)
        .Cells(LR, i + 1).Value = Sheets("Form").Range(cls(i)).Value
    Next i
End With

cls2 = Array("E51", "E52", "E53", "E54", "E55", "E56", "E57", "E58", "G59", "E60", "E61", "E62", "G63", "E64", "E65", "E66", "E67", "C70", "D70", "E70", "F70", "G70", "H70", "C71", "E71", "G71", "C72", "E72", "G72", "C73", "E73", "G73", "C74", "E74", "G74", "C75", "E75", "G75", "C76", "E76", "G76", "C77", "E77", "G77", "C78", "E78", "G78", "C79", "E79", "G79", "C82", "D82", "E82", "F82", "G82", "H82", "C83", "E83", "G83", "C84", "E84", "G84", "B88", "B89", "B90", "B91", "C88", "C89", "C90", "C91", "D88", "D89", "D90", "D91", "E88", "E89", "E90", "E91", "F88", "F89", "F90", "F91", "G88", "G89", "G90", "G91", "H88", "H89", "H90", "H91")
With Sheets("Tracker")
    LR2 = WorksheetFunction.Max(3, .Range("EW" & Rows.Count).End(xlUp).Row + 1)
    For j = LBound(cls2) To UBound(cls2)
        .Cells(LR, j + 1).Value = Sheets("Form").Range(cls2(j)).Value
    Next j
    End With
End Sub

我看了你的檔案。 我做的第一件事就是通過VBA翻轉和嘗試編譯它-這順便說一下,我會推薦給任何人與下載的第一步 XLSM (我還沒有看到惡意的宏,所以我想保持這種狀態!)

我可以看到該文件是一個“進行中的工作”,因為在這里和那里有一些代碼無法正確編譯,例如Me語句指向丟失的用戶Form (View) ,以及對諸如Form (View)等錯誤命名的工作表的引用Form (View)而不是View_Form

理想情況下,應將該項目從Excel移至Access。 Excel 可以用於填寫表格和存儲數據,但是如果這可能會變得相當大,那么最好使用“正確的工具”。 將您的表單復制到Access表單中可立即消除將某些單元格復制到某些工作表的需要,更不用說易於驗證,報告,安全性和無限的擴展空間,以及在Excel,Access,Outlook等之間移動數據的便捷性。

(您甚至曾經將電子表格稱為數據庫!)如果您擔心自己不熟悉Access,那么如果您設計了此工作簿,那么一旦弄清表和表單設計的基礎知識,便可以輕而易舉地遷移到Access。

甚至Outlook也具有一些漂亮的表單功能,當收到電子郵件表單時,這些功能可以自動填充數據表。

如果您需要保留在Excel中,那么使用用戶表單而不是基於工作表的表單呢? 我經常看到人們忘記Office的內置功能,而從頭開始。 話雖如此,我已經成為MS Office的用戶25年了, 從未使用過Excel用戶表單。 當我認為“形式”時,我認為是MS Access

另一個選擇是,如果您希望保留基於工作表的表單,而不是列出數組中的所有單元格等,則進行較小的重新設計可以使其更簡單。 一種方法是在“表單”選項卡上有一個隱藏行,這樣您就可以在所有需要存儲的數據中保留一行。 例如,您可以隱藏第1行和第2行,將第1行的標題設為“ Sourced Processed Year Address等,然后將第2行作為存儲數據的“臨時”位置,因此A2公式為=C2 ,B2為=C3', B3 is = C5`等。

最后,另一個偷偷摸摸的選擇可能是在每個需要保存數據的單元格中添加隱藏的注釋 ,然后在表單完成后,遍歷所有查找注釋的單元格,每個注釋將包含一個標題或單元格引用,指示該單元的數據需要存放的位置。

目標應該是一個非常簡單的 ,可以根據需要使用任意多的列,但它不是格式化或公式的地方。 (請考慮數據庫!)例如, C2 (由“來源”提供)可能具有諸如“ Tracker:C”之類的隱藏注釋,然后在填寫表單時,您可以解析注釋並動態移動數據(而不是對250個單元格地址進行硬編碼!)與類似:

Option Explicit

Sub moveData() 'untested; example only

    Dim cell As Variant, nextBlankRow As Integer
    Dim comm As String, sht As String, col As String

    nextBlankRow = 5 'calculate this somehow

    'loop through cells with comments
    For Each cell In ActiveSheet.Cells.SpecialCells(xlCellTypeComments)

        If cell.Comment.Text <> "" Then
            'get comment
            comm = cell.Comment.Text

            'extract location for data like "Sheetname:Columnletter"
            sht = Left(comm, InStr(comm, ":") - 1)
            col = Right(comm, Len(comm) - InStr(comm, ":"))

            'populate correct location with data
            Sheets(sht).Range(col & nextBlankRow).Value = cell.Value
        End If

    Next cell

End Sub

與Excel(或Office的一般情況)中的任何內容一樣,您可以通過多種方法來完成相同的任務。 選擇那些不涉及一遍又一遍地重復相同代碼,也不涉及硬編碼數據的代碼。 計划未來(意外)的增長非常重要,您可以隨時調試,這是我的最后建議:

Option Explicit

在每個模塊的頂部, Alt + D L經常編譯,刪除或注釋掉未使用的代碼。

底線,最好的選擇:Access,Excel,Outlook都內置了表單功能。將表單用於表單,您現在以后都會為自己省去麻煩。

希望這會給您一些想法。

祝好運!

假設您想在右側的表格“ Tracker”中開始單元格條目,則可以添加列號而不是+1(= A列),並編寫如下:

數組1:從C列開始分配單元格值

   .Cells(LR, i + [C1].Column).Value = Sheets("Form").Range(cls(i)).Value

數組2:從EF列開始分配單元格值

  ' should be LR2 instead of LR :-)
   .Cells(LR2, j + [EF1].Column).Value = Sheets("Form").Range(cls2(j)).Value

注意

[C1].column返回列號(在任何工作表中),例如列C Counts 3。

暫無
暫無

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

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