通过按钮单击将单元格的值存储在另一个Excel文档中

时间:2018-04-19 11:19:10

标签: excel vba excel-vba button

我在StackOverflow和编码本身上都是新手,我只有很少的知识,所以不要对我很难:)

发生了什么: 我有一个名为C:\Program\Program.xlsm的{​​{1}}存储的文档 它有不同的工作表,其中一个是对象 - 它从存储在Program.xlsm的另一个文件中检索对象。

C:\Program\Objects.xlsx还有一个名为“Calculate”的工作表,它有一个带有列表数据验证的单元格C6和一个自动完成功能,但其他值,而不是列表中的值也是可能的。

我想做的是: 如果Program.xlsm上尚未Sheet("Calculate").Range("C6").Text,我希望通过点击按钮添加Objects.xlsx。我添加了按钮,并添加了一个VBA代码:

Sub CommandButton1_Click()
Dim c As Range
Dim dupFound As Boolean
Dim lastRow As Long
Dim wbk1 As Workbook
Dim str As String
Set str = ActiveSheet.Range("C6").Text
Set wbk1 = Workbooks.Open("C:\Program\Objects.xlsx")
dupFound = False
lastRow = wbk1.Worksheets("Objects").Cells(Rows.Count, "B").End(xlUp).Row

For Each c In wbk1.Worksheets("Objects").Range("$B$2:$B$" & lastRow)
    Debug.Print c.Value
    If c.Value = str Then
        dupFound = True
        MsgBox "The object already exists"
        Exit For
    End If
Next c

If dupFound = False Then
    Cells(lastRow + 1, "B").Value = str
End If
End Sub

提醒一下:我是编码的新手,所以不要对我很难:)谢谢!

1 个答案:

答案 0 :(得分:1)

这里的主要问题是这一行

Cells(lastRow + 1, "B").Value = str

您没有指定单元格在哪个工作簿和工作表中。始终指定工作表,否则Excel会猜测工作表,而Excel可能会猜到除此之外的其他内容。

第二个问题是字符串Dim str As String不是对象,因此Set

中不需要Set str = ActiveSheet.Range("C6").Text

我还建议使用WorksheetFunction.Match Method来检查某个值是否已经在B列中。这应该比循环遍历每个单元格要快得多。

Option Explicit

Public Sub CommandButton1_Click()
    Dim str As String
    str = ActiveSheet.Range("C6").Text

    Dim wbk1 As Workbook
    Set wbk1 = Workbooks.Open("C:\Program\Objects.xlsx")

    Dim lastRow As Long
    lastRow = wbk1.Worksheets("Objects").Cells(Rows.Count, "B").End(xlUp).Row

    Dim FoundRow As Long
    FoundRow = 0 'initialize

    'try to match the string with worksheets Objects column B
    On Error Resume Next
    FoundRow = Application.WorksheetFunction.Match(str, wbk1.Worksheets("Objects").Range("B:B"), 0)
    On Error GoTo 0

    If FoundRow = 0 Then 'if nothing matched FoundRow is still 0 otherwise FoundRow contains the row number of the match
        wbk1.Worksheets("Objects").Cells(lastRow + 1, "B").Value = str
    Else
        MsgBox "The object already exists in row " & FoundRow
    End If 
End Sub