简体   繁体   中英

Use VLOOKUP to pass cell reference to a public variable?

I have a userform that opens on cell change in a column. That userform contains checkboxes, which all trigger a second userform with a text box which looks up a cell on a hidden sheet for its contents. (The checkbox that's ticked determines which cell the textbox looks for). The user then edits the box, clicks a button, and the new text is written back to the same cell.

This is the VBA for when the checkbox is ticked. It works great. Hooray!

Dim vln As Variant
Dim reta As Worksheet

Set reta = ActiveWorkbook.Sheets("RetailerActivity")
Set vln = ActiveCell.Offset(-1, -3)

UserForm2.TextBox1.Text = Application.WorksheetFunction.VLookup(vln, reta.Range("A1:Z100"), 3, False)

UserForm2.TescoSave.Visible = True
UserForm2.Show

End Sub

When the textbox has been edited, I would like to write it back to the same cell it came from. I figure the easiest way to do that is to have a public variable (as range), and to pass the result of the vlookup into that variable so the second userform can have a line which reads

Private Sub ASave_Click()

publicvariable.Value = TextBox1.Value
userform1.hide

End Sub

Nice and easy, rather than doing a VLookup again. Right?

Either way, I can't seem to set the public variable as the lookup.

Outside of any sub I have

Public bums As Range

And in the code above, after the bit where I've set the text box, I've tried to add the line

Set bums = Application.WorksheetFunction.VLookup(vln, reta.Range("A1:Z100"), 3, False)

But the code errors with a "type mismatch".

If I try

Set bums = Range(Application.WorksheetFunction.VLookup(vln, reta.Range("A1:Z100"), 3, False))

I get method "Range" of object "_global" failed.

I code by cobbling bits off the internet, as you can probably tell, so this is I don't doubt a complete kludge.

Any advice would be super appreciated.

VLookup returns a value, not a Range. You could use Match to find the row and then Cells to get the actual reference - for example:

Dim vMatch
vMatch = Application.Match(vln, reta.Range("A1:A100"),0)
If Not IsError(vMatch) then 
Set bums = reta.Cells(vMatch, "C")
else
msgbox "No match for " & vln
Exit Sub
End If

Personally I would also not use a public variable, but create a property for Userform2 to which you can assign the range.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM