I'm trying to use vlookup to read a string from a word document and return corresponding values from an excel sheet. I seem to be getting a "Subscript out or Range" Error on the vlookup function.
This is the worksheet that i am looking at:
Sample Data
The code I have is:
Sub Autofill()
Dim oExcel As New Excel.Application
Dim testdb As Excel.Workbook
Dim testvar1 As Double
Set testdb = oExcel.Workbooks.Open("k:\SIF\Vibration\Dbase.xlsm")
testvar1 = oExcel.WorksheetFunction.VLookup("Roger", testdb.Sheets("Main").Range("A1:C4"), 2, False)
MsgBox (testvar1)
End Sub
I tried using the Application.Vlookup function as well, to no avail. Got the same error.
This script worked for me. Make sure the Main tab exists, that's how I duplicated the error.
A missing value in the VLookup will give you "Unable to get Vlookup property..." error.
Related
I have a macro (Excel 2010) and a textbox with name CSVExport in the sheet. Here is the code:
Option Explicit
Sub Export()
Dim exportRangeStr As String
Dim currSheet As Worksheet
Set currSheet = Worksheets("Skill Experience")
exportRangeStr = currSheet.CSVExportRange.Value
Debug.Print 1
When I try to run it I get an error "Compile error: Method or data member not found" with .CSVExportRange highlighted. But when I comment that line out and set a breakpoint in the last line I see in the watch window that currSheet has the CSVExportRange field and all its data properly stored. What am I doing wrong?
The generic Worksheet class does not have a CSVExportRange member. You either need to declare your currSheet variable as an Object, or using the specific code name for the worksheet in question (or the relevant interface if you've set one up).
I'm trying to iterate over the used range in a worksheet and match the given .name.name attribute to a cStringBuilder for future use in a web application.
But I'm running into errors with the append function and using the .name.name attribute of a cell.
If I use something like Worksheets("MAIN").Range("F2").name.name I extract the correct information. But it doesn't work will the for loop.
If I use cell.nameit does however extract the correct cell values. But I have to match a .name.name attribute as I can't be sure on exactly where in the sheet the data is presented always.
The error message I'm getting is: Run-time error '1004': Application-defined or object-defined error
Here's my coding that I'm trying to make work.
Public Function Testing() As cStringBuilder
Dim strJson As cStringBuilder
Set strJson = New cStringBuilder
For Each cell In Worksheets("MAIN").UsedRange
If cell.Value <> "" Then
strJson.Append (cell.name.name)
End If
Next
Testing = strJson
End Function
For Each cell In Worksheets("MAIN").UsedRange
On Error Resume Next
Debug.Print cell.Name.Name
Next cell
This seems to work for me, if there isn't a name, you'll get an error.
Anyone knows what's the problem with my code?
Sub reFormat()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Admin")
ws.Range("C21").Formula = "=""S4&""AA5&""AA6&""AA7&""AA8&""AA9&""AA10" 'returns applica-
tion defined or object-defined error
End Sub
And I want the output of this code to be: =S4&(AA5&AA6&AA7&AA8&AA9&AA10)
Thanks for the help!
Your formula is fundamentally invalid. The string evaluates to this:
="S4&"AA5&"AA6&"AA7&"AA8&"AA9&"AA10
Which isn't a valid Excel formula.
You have too many quotes. If these are cell references and your formula intends to concatenate them, and you want your string to evaluate to this:
=S4&(AA5&AA6&AA7&AA8&AA9&AA10)
Then you could just do this:
.Formula = "=S4&(AA5&AA6&AA7&AA8&AA9&AA10)"
I have a few cells in my excel workbook which are available for a client to put his own values. I wanted the workbook to initialize those cells with default values. In order to do so I have a worksheet "Arkusz do makr", where I store the values.
In a module "GM" I declare a variable to reference my worksheet easier like this:
Public M As Worksheet
Then I initialize this variable and set my default values like this (in ThisWorkbook):
Private Sub Workbook_Open()
Set M = Worksheets("Arkusz do makr")
Worksheets("Values").Range("Value1") = M.Range("Value1")
Worksheets("Values").Range("Value2") = M.Range("Value2")
Worksheets("Values").Range("Value3") = M.Range("Value3") `etc
End Sub
Now sometimes this works like a charm, and sometimes, when I open the workbook I get a
Run-time error '91': Object variable or With block variable not set.
Could someone please explain this behaviour to me? Additionally I would like to ask if my approach makes sense, since I have a hard time grasping the order of events in excel as well as the range of its objects.
EDIT: Additionally I should mention that the Debug function highlights the first Worksheets... line in my code. In specific worksheets I reference the M object as well, though I thought it changes anything here...
Try to change the code of this Sub like below.
I have added a simple error handling - if there is no worksheet "Arkusze do makr" or "Values" in your workbook, warning message is displayed and default values are not copied.
You can find more comments in code.
Private Sub Workbook_Open()
Dim macrosSheet As Excel.Worksheet
Dim valuesSheet As Excel.Worksheet
'------------------------------------------------------------------
With ThisWorkbook
'This command is added to prevent VBA from throwing
'error if worksheet is not found. In such case variable
'will have Nothing as its value. Later on, we check
'the values assigned to those variables and only if both
'of them are different than Nothing the code will continue.
On Error Resume Next
Set macrosSheet = .Worksheets("Arkusz do makr")
Set valuesSheet = .Worksheets("Values")
On Error GoTo 0 'Restore default error behaviour.
End With
'Check if sheets [Values] and [Arkusz do makr] have been found.
'If any of them has not been found, a proper error message is shown.
'In such case default values are not set.
If valuesSheet Is Nothing Then
Call VBA.MsgBox("Sheet [Values] not found")
ElseIf macrosSheet Is Nothing Then
Call VBA.MsgBox("Sheet [Arkusz do makr] not found")
Else
'If both sheets are found, default values are copied
'from [Arkusz do makr] to [Values].
'Note that if there is no Range named "Value1" (or "Value2" etc.)
'in any of this worksheet, another error will be thrown.
'You can add error-handling for this case, similarly as above.
With valuesSheet
.Range("Value1") = macrosSheet.Range("Value1")
.Range("Value2") = macrosSheet.Range("Value2")
.Range("Value3") = macrosSheet.Range("Value3")
End With
End If
End Sub
I have created a custom function in Excel using VBA. I'm trying to get data from a different workbook using the Workbooks.Open(path) command. Here's my code:
Option Explicit
Function TestFunction() As String
mySub
TestFunction = "Success."
End Function
Sub mySub()
Dim path As String
Dim wk As Workbook
path = "C:\Users\jg\Desktop\machine_data.xlsm"
Set wk = Workbooks.Open(path)
Dim ws As Worksheet
Set ws = wk.Sheets(1)
Debug.Print ws.Range("A2")
End Sub
Sub Test()
Debug.Print (TestFunction())
End Sub
Now my problem is the following:
When I run the Sub Test() within the VBA environment from Excel everything works as planned. machine_data.xlsm gets opened and the field A2 shows up in debug.
Once I go to the workbook where I defined this module in and type =TestFunction() into a cell, I get a #VALUE!. The file also doesn't get opened.
If I comment these two lines:
Set ws = wk.Sheets(1)
Debug.Print ws.Range("A2")
the cell will show Success!, but the file still doesn't open.
What am I doing wrong? Both workbooks are .xlsm files. I am using Microsoft Office Excel 2007.
Just throw everything from mySub into the test function and if everything is successful have test function return the value of the cell. So testFunc = ws.Range("A2").
As DaveU already stated UDFs can only return values. I found a different workaround simply calling the function from within the VBA environment which lets me modify cell contents wherever I'd like.