Return to VBA Code Examples
This article will demonstrate how to Fix VBA Error 438 – Object Doesn’t Support Property or Method.
Error 438 is a frequently occuring error in Excel VBA and is caused by either omitting a property or method when referring to an object, or by using a property or method that is not available to an object in the VBA code.
Check the VBA code to Fix Error 438
Let us examine the following code:
Sub RemoveWorksheet()
Dim wb As Workbook
Dim ws As Worksheet
Dim sheetName As String
sheetName = "Sheet 1"
Set wb = ActiveWorkbook
For Each ws In wb.Sheets
If ws = sheetName Then
wb.Sheets(sheetName).Delete
Exit For
End If
Next ws
End Sub
If we run this code, Error 438 will occur.
To resolve this issue, we click on Debug to see where the error is occurring.
This line of code is trying to equate the worksheet (depicted by the variable ws) to the sheet name. This is not possible as the worksheet is an object but the sheet name is a string so Error 438 is therefore returned.
To solve this, compare the string sheetName to the name property of the worksheet object:
ws.name = sheetName
Now the code runs without issue!
To show a list of all the properties or methods that are available to the worksheet object, we can type a dot (.) after the object.
This invokes the VBA Editor’s Intellisense feature. To make sure it’s turned on, in the Menu, select Tools > Options.
Make sure Auto List Members is checked and then click OK.
NOTE: This is usually on by default.
You can also find a list of all the Properties, Methods and Events for an Excel Object in the Object Browser.
In the Menu, select View > Object Browser or press F2 (See more VBE shortcuts).
A list of classes and objects will appear in the left hand side of the screen. If you click on the object you wish to use (eg: Workbook), a list of all the Properties, Methods and Events that that object supports will appear in the right hand side of the screen. (eg: Members of Workbook).
VBA Coding Made Easy
Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
Learn More!
First of all, you should know, that some of functions, used on the worksheet, have limitations. So my point is avoid of using them in VBA, if it is not necessary.
For example, function POWER()
returns error on attempt to raise a zero to zero. An alternative is to use 0 ^ 0
combination, which is exactly doing the same, but looks more simply and operates without such error.
But also there is no embedded alternative in VBA to the FACT()
function, so you can use it, or simply add your own function factor()
— it’s uppon your choise.
If you just have started learning VBA, I would recomend you to use Option Explicit
. It will help you to find out, which variables are not defined, and sometimes to avoid errors related to variable names missprint.
Here is your code, fixed and a little bit optimized:
Option Explicit' It is an option that turns on check for every used variable to be defined before execution. If this option is not defined, your code below will find undefined variables and define them when they are used. Good practice is to use this option, because it helps you, for example to prevent missprinting errors in variable names.
Sub Bezier()
Dim C as Double , t As Double
Dim k As Long, n As Long, i As Long
n = 3
For i = 0 To 100
t = i * 0.01
Cells(i + 2, 6) = 0
Cells(i + 2, 7) = 0
For k = 0 To n
C = (WorksheetFunction.Fact(n) / WorksheetFunction.Fact(k)) / WorksheetFunction.Fact(n - k)
Cells(i + 2, 6) = Cells(i + 2, 6).Value + Cells(k + 2, 1).Value * C * (t ^ k) * ((1 - t) ^ (n - k))
Cells(i + 2, 7) = Cells(i + 2, 7).Value + Cells(k + 2, 2).Value * C * (t ^ k) * ((1 - t) ^ (n - k))
Next
Next
End Sub
UPDATE
Here are some examples of factorial calculations.
Public Function fnFact(number) ' a simple cycle example of Factorial function
Dim tmp As Long ' new temporary variable to keep the "number" variable unchanged
tmp = number
fnFact = number
While tmp > 1
tmp = tmp - 1
fnFact = fnFact * tmp
Wend
End Function
Public Function fnFactR(number) ' a simple example of recursive function for Factorial calculation
If number > 0 Then
fnFactR = fnFactR(number - 1) * number ' function calls itself to continue calculations
Else
fnFactR = 1 ' function returns {1} when calculations are over
End If
End Function
Sub Factor_test() 'RUN ME TO TEST ALL THE FACTORIAL FUNCTIONS
Dim number As Long
number = 170 ' change me to find Factorial for a different value
MsgBox "Cycle Factorial:" & vbNewLine & number & "!= " & fnFact(number)
MsgBox "WorksheetFunction Factorial:" & vbNewLine & number & "!= " & WorksheetFunction.Fact(number)
MsgBox "Recursive Factorial:" & vbNewLine & number & "!= " & fnFactR(number)
End Sub
All those functions are available to calculate Factorial only for numbers before 170 inclusively, because of large result value.
So for my PC the limitation for WorksheetFunction.Fact()
function is also 170.
Let me know, if your PC has different limitation for this function, — it’s quite interesting thing.
UPDATE2
It is recomended to use Long
data type instead of Integer
each type when integer (or whole number) variable is needed. Long
is slightly faster, it has much wider limitations and costs no additional memory. Here are proof links:
1. MSDN:The Integer, Long, and Byte Data Types
2. ozgrid.com:Long Vs Integer
3. pcreview.co.uk:VBA code optimization — why using long instead of integer?
Thanks for @Ioannis and @chris neilsen for the information about Long
data type and proof links!
Good luck in your further VBA actions!
Есть файл, работающий уже лет 7. На странице кнопка, при открытии проверяется контрольное поле и в зависимости от этого кнопка активна или нет (.Enable=True or False). Файл работал в нескольких версиях оффиса. Последнее время на 2010 и 2013 (основная версия). В результате последнего апдейта оффиса стало появляться сообщение, приведенное в описании темы. Кроме того, ранее в режиме конструктора можно было просмотреть свойства объекта (кнопки, к примеру) на листе, теперь же вызываются свойства листа, содержащего объект.
Проверил на соседней машине, оффис 2010 СП2 без последних апдейтов — все ОК. Выполнил обновление — картина та же, что описана выше…
Кто-нить сталкивался с подобной проблемой? Спасибо!
ЗЫ: Кстати, подобную проблему нашел в архиве за 2012, но на ХР у меня не возникало подобных ошибок…
http://www.planetaexcel.ru/forum/?PAGE_NAME=read&FID=8&TID=42275
David Zemens got your answer.
Here’s how to avoid repeating it.
Looking at this line:
For Each item In Worksheets("Collector").SlicerCaches("Slicer_RptDate").SlicerItems
If we made every statement explicit, it would look like this:
For Each item In Worksheets.Item("Collector").SlicerCaches.Item("Slicer_RptDate").SlicerItems
In other words:
Worksheets.Item("Collector") _
.SlicerCaches.Item("Slicer_RptDate") _
.SlicerItems
That’s a lot of member accesses for a single instruction.
By introducing intermediate variables…
Dim collectorSheet As Worksheet
Set collectorSheet = Worksheets("Collector")
Dim rptDateSlicerCache As SlicerCache
Set rptDateSlicerCache = collectorSheet.SlicerCaches("Slicer_RptDate") '*
For Each item In rptDateSlicerCache.SlicerItems
'...
Next
…you could have noticed while typing the line marked with a '*
comment, that IntelliSense doesn’t offer SlicerCaches
as a member of collectorSheet
.
Why? Because this:
Worksheets("Collector")
Returns an Object
— and from that point on, you’re on your own: IntelliSense can’t help you with autocompletion, because members of an Object
aren’t resolved until runtime.
By assigning that object to a Worksheet
variable, you give yourself compile-time checking, and avoid that pesky runtime error 438.
- Remove From My Forums
-
Question
-
Good day
i seem to get a run-time error 438: Object doesn’t support this property or Method every time i try running my macro to automatically attach a PDF file called «Statement.xlsm»
Please assist, i am new at this VBA
here is my code:
Dim objOutlook As Object
Dim objNameSpace As Object
Dim objInbox As Object
Dim objMailItem As Object
Set objOutlook = CreateObject(«Outlook.Application»)
Set objNameSpace = objOutlook.GetNamespace(«MAPI»)
Set objInbox = objNameSpace.Folders(1)
Set objMailItem = objOutlook.CreateItem(0)
‘Declare a String variable for the recipient list, and an Integer variable
‘for the count of cells in column A that contain email addresses.
Dim strTo As String
Dim i As Integer
strTo = «»
i = 1‘Loop through the recipient email addresses to build a continuous string that separates recipient addresses by a semicolon and a space.
With Worksheets(«Statement») ‘change sheet name where list is kept.
Do
strTo = strTo & .Cells(i, 25).Value & «; «
i = i + 1
Loop Until IsEmpty(.Cells(i, 25))
End With
‘Remove the last two characters from the recipient string, which are
‘an unnedded semicolon and space.
strTo = Mid(strTo, 1, Len(strTo) — 2)
‘Display the email message with the attached active workbook.
With objMailItem
.To = strTo
.CC = «Eutychus@gcis.gov.za»
.Subject = «Media buying Statement»
.Body = _
«Hello everyone,» & Chr(10) & Chr(10) & _
«Here’s an example for attaching the active workbook» & Chr(10) & _
«to an email with multiple recipients.»Dim Attachment1 As String
Attachment1 = «http://ecms.gcis.gov.za/sites/docs/fin_mngmnt/47 Systems/4-7-3 Media Buying System/4-7-3-1 Media Buying Statements/Statement.xlsm.pdf»
.addAttachments
Attachment1 ‘(this is were is says i must
debug).Display ‘Change to Send if you want to just send it.
End With
‘Release object variables from system memory.
Set objOutlook = Nothing
Set objNameSpace = Nothing
Set objInbox = Nothing
Set objMailItem = NothingThank you in advance
Answers
-
The correct would be:
.Attachments.Add Attachment1
However, I couldn’t get the file in the URL indicated by Attachment1, because the URL http://ecms.gcis.gov.za/sites/docs/fin_mngmnt/47 Systems/4-7-3 Media Buying System/4-7-3-1 Media Buying Statements/Statement.xlsm.pdf doesn’t exist. Are you sure it is
correct?
Felipe Costa Gualberto — http://www.ambienteoffice.com.br
-
Proposed as answer by
Thursday, January 22, 2015 3:34 AM
-
Marked as answer by
Fei XueMicrosoft employee
Thursday, January 29, 2015 10:47 AM
-
Proposed as answer by