我在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
提醒一下:我是编码的新手,所以不要对我很难:)谢谢!
答案 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