Error Handling: Bulletproof VBA: Strategies for Effective Error Handling

1. Introduction to Error Handling in VBA

error handling in vba is a critical aspect of developing robust and user-friendly applications. It's the process of anticipating, detecting, and resolving programming, application, or communication errors. The primary goal is to prevent errors from crashing an application and to provide a friendly error message to the user instead. This is particularly important in VBA because it often interacts with other Office applications and users who may not be familiar with technical error messages.

From a developer's perspective, error handling involves writing code that can gracefully handle unexpected situations. From a user's perspective, it means encountering clear, informative messages instead of cryptic error codes or, worse, no indication that something has gone wrong. For businesses, effective error handling can mean the difference between a minor user complaint and a costly technical support issue.

Here are some in-depth insights into error handling in VBA:

1. The Basics of Error Handling: At its simplest, error handling involves the `On Error` statement to direct VBA to handle errors in various ways. `On Error GoTo` lets you jump to a label when an error occurs, while `On Error Resume Next` will ignore the error and continue with the next line of code.

2. Types of Errors: Understanding the different types of errors can help in writing effective error handling code. Compile errors, which occur when code is written incorrectly, are different from runtime errors, which occur during execution.

3. Using err object: The `Err` object is part of VBA's intrinsic objects and contains information about the most recent error. It's used within an error handling routine to determine the nature of the error and to decide how it should be handled.

4. Creating Custom Errors: You can define your own errors using the `Error` function along with a unique number. This is useful for signaling custom error conditions that your code can specifically handle.

5. Best Practices: It's considered best practice to include error handling in every procedure and to exit the procedure safely if an error occurs. This often involves using the `Exit Sub` or `Exit Function` statement before the error handling code to prevent the procedure from running the error handling code if there's no error.

6. Logging Errors: Keeping a log of errors can be invaluable for debugging and improving your application. This can be done by writing error details to a text file, a database, or even sending an email alert.

7. User Communication: When an error occurs, communicating with the user is essential. This could involve displaying a message box with an error message or writing a log entry that the user can understand and report.

Here's an example to highlight the idea of custom error handling:

```vba

Sub HandleErrorExample()

On Error GoTo ErrorHandler

Dim result As Integer

Result = 100 / 0 ' This will cause a division by zero error

Exit Sub

ErrorHandler:

If Err.Number = 11 Then ' Division by zero error

MsgBox "Cannot divide by zero, please provide a non-zero denominator.", vbExclamation, "Division Error"

Else

MsgBox "An unexpected error occurred: " & Err.Description, vbCritical, "Error"

End If

Resume Next

End Sub

In this example, we have a simple subroutine that attempts to divide 100 by zero, which will trigger a runtime error. The error handling code checks if the error number corresponds to a division by zero and, if so, displays a user-friendly message. Otherwise, it displays a generic error message. This approach ensures that users are not left confused by unhandled errors and that they receive clear instructions on what went wrong and how to proceed. It's a fundamental part of creating a seamless and professional user experience in any vba application.

Introduction to Error Handling in VBA - Error Handling: Bulletproof VBA: Strategies for Effective Error Handling

Introduction to Error Handling in VBA - Error Handling: Bulletproof VBA: Strategies for Effective Error Handling

2. Common VBA Error Types and What They Mean

In the realm of VBA (Visual Basic for Applications), error handling is not just a defensive programming strategy; it's an art that, when mastered, can lead to robust and resilient code. Errors are inevitable when programming—after all, to err is human, and our code is often a reflection of our complex thought processes. Understanding common VBA error types is crucial for debugging and enhancing the reliability of macros and scripts. These errors can range from simple syntax mistakes to more complex logical errors that only reveal themselves under specific conditions. By dissecting these errors and their meanings, we can develop a more intuitive sense of how vba interacts with the host applications, such as Excel, Access, or Word, and how it processes data and commands.

Let's delve into some of the most common VBA error types:

1. Compile Errors: These occur when VBA code doesn't follow the proper syntax or structure required by the language. For example, missing an `End If` statement can cause a compile error.

Example:

```vba

If Range("A1").Value > 0 Then

MsgBox "Value is positive."

' Missing End If here causes a compile error

```

2. Runtime Errors: These happen during the execution of the code, often due to invalid operations, such as dividing by zero or referencing a non-existent object.

Example:

```vba

Dim x As Integer

X = 5 / 0 ' This will cause a runtime error: Division by zero

```

3. Logical Errors: Perhaps the most insidious, logical errors occur when the code runs without any syntax or runtime errors but produces incorrect results due to flawed logic.

Example:

```vba

Dim i As Integer

For i = 1 To 10

' Incorrect logic: This will always print "Number is even."

If i Mod 2 = 0 Then

Debug.Print "Number is even."

Else

Debug.Print "Number is even."

End If

Next i

```

4. Object Errors: These are specific to object-oriented aspects of VBA, where an object is not set correctly or is used inappropriately.

Example:

```vba

Dim ws As Worksheet

Set ws = Sheets("NonExistentSheet") ' This will cause an object error

```

5. Data Type Errors: VBA is a type-safe language, meaning that variables are designed to hold specific types of data. Assigning the wrong type of data to a variable can lead to errors.

Example:

```vba

Dim strNumber As String

StrNumber = "One"

Dim intNumber As Integer

IntNumber = CInt(strNumber) ' This will cause a data type error

```

Understanding these errors and their implications can significantly improve the debugging process. It allows developers to anticipate where things might go wrong and put checks in place to handle those situations gracefully. effective error handling in vba not only prevents crashes but also provides meaningful feedback to users, guiding them through the resolution of issues that may arise. This proactive approach to error management is what separates a functional script from a professional, user-friendly application.

Common VBA Error Types and What They Mean - Error Handling: Bulletproof VBA: Strategies for Effective Error Handling

Common VBA Error Types and What They Mean - Error Handling: Bulletproof VBA: Strategies for Effective Error Handling

3. The Basics of Using On Error Statements

In the realm of VBA programming, error handling is not just a defensive programming technique; it's an essential strategy to ensure the robustness and reliability of your code. The 'On Error' statement is the backbone of vba error handling, providing a structured way to deal with runtime errors that could otherwise abruptly end your program. Understanding the basics of using 'On Error' statements is akin to learning the safety procedures before operating heavy machinery—it's about prevention, protection, and creating a controlled response to the unexpected.

1. On Error GoTo Label: This form of the 'On Error' statement redirects the flow of the program to a label when an error occurs. It's crucial to place the label in the same procedure as the 'On Error' statement. Here's an example:

```vba

Sub ExampleProcedure()

On Error GoTo ErrorHandler

' Code that might cause an error goes here

Exit Sub

ErrorHandler:

' Code to handle the error goes here

Resume Next

End Sub

2. On Error Resume Next: This line tells VBA to continue with the next line of code when an error occurs. It's particularly useful when you expect an error as part of normal operations or when you have an alternative solution ready. However, it can lead to missed errors if not used carefully.

3. On Error GoTo 0: This statement turns off error handling in the current procedure. It doesn't clear the error but rather tells the program to stop looking for errors. Use this when you want to handle errors differently in different parts of the code.

4. error Handling block: A well-structured error handling block includes error trapping, error handling, and error clearing. It ensures that the program can recover gracefully from an error and continue running or terminate cleanly.

5. Error Object: When an error occurs, VBA creates an instance of the Error object. This object contains details about the error, and you can use it within your error handling code to inform the user, log the error, or decide on a recovery strategy.

6. Multiple Error Handlers: In complex procedures, you might need different error handlers for different sections of code. This requires careful planning and clear comments to maintain readability and functionality.

7. Best Practices: Always clear the error object after handling an error to prevent the same error from being raised again. Also, include comments to explain the purpose of the error handling code for future reference.

By incorporating these insights into your VBA programming, you can create error-resistant applications that stand up to the rigors of real-world use. Remember, effective error handling in VBA is not just about catching errors; it's about creating a user experience that is seamless and professional, even when things go wrong behind the scenes.

4. Implementing Try-Catch Logic in VBA

implementing try-catch logic in vba is a cornerstone of robust error handling. Unlike some other programming languages, VBA does not have a built-in try-catch structure, but similar functionality can be achieved using `On Error` statements. This approach allows developers to gracefully handle errors, ensuring that the user experience remains uninterrupted by unexpected issues. By anticipating potential errors and writing code to manage them, we can create applications that are both resilient and user-friendly.

From the perspective of a seasoned developer, error handling is not just about catching errors as they occur; it's about foreseeing potential pitfalls and guiding the program flow to maintain stability. For a beginner, it might seem like an additional layer of complexity, but it's a practice that pays dividends in maintaining and debugging code.

Here's an in-depth look at implementing try-catch logic in VBA:

1. Understanding `On Error` Statements: VBA provides the `On Error GoTo` statement to divert code execution to a specified label when an error occurs.

2. Setting Up an Error Handling Block: By defining a label, such as `ErrorHandler:`, you can create a block of code that functions similarly to a catch block.

3. Resuming Execution: After handling the error, use `Resume` to return control to the main code flow.

4. Cleaning Up Resources: Ensure that any opened resources are properly closed or released in the error handling block.

5. Logging Errors: Consider writing errors to a log file for later analysis, which can be invaluable for debugging and improving the application.

For example, consider a scenario where you're processing a list of files:

```vba

Sub ProcessFiles()

On Error GoTo ErrorHandler

Dim filePath As String

FilePath = "C:\example.txt"

' Attempt to open the file

Open filePath For Input As #1

' Code to process the file goes here

' Close the file

Close #1

Exit Sub

ErrorHandler:

' Log the error number and description

Debug.Print "Error " & Err.Number & ": " & Err.Description

' Close the file if it's open

If Not EOF(1) Then Close #1

' Resume execution with the next file or exit

Resume Next

End Sub

In this example, if an error occurs while opening or processing the file, the code jumps to the `ErrorHandler` label, logs the error, ensures the file is closed, and then resumes with the next operation or exits the subroutine.

By incorporating these strategies into your VBA projects, you can create a safety net that captures and handles errors effectively, making your applications more reliable and professional.

Implementing Try Catch Logic in VBA - Error Handling: Bulletproof VBA: Strategies for Effective Error Handling

Implementing Try Catch Logic in VBA - Error Handling: Bulletproof VBA: Strategies for Effective Error Handling

5. Creating Robust Error Handlers

In the realm of VBA programming, robust error handling is not just a luxury but a necessity. As developers, we strive to write code that runs smoothly, but the reality is that errors are inevitable. Whether due to unexpected user input, external system changes, or simply unforeseen scenarios, errors can and will occur. The key to managing these situations is not to prevent errors at all costs, but to handle them in a way that maintains the integrity of the program and provides a seamless experience for the user. This means crafting error handlers that are not only functional but also resilient and informative.

From the perspective of a seasoned developer, robust error handlers serve as a safety net, allowing the program to recover gracefully from unexpected events. For users, a well-handled error can be the difference between frustration and satisfaction, as clear communication and guidance can significantly reduce confusion and downtime. From a maintenance standpoint, robust error handlers facilitate easier debugging and updating of the code, as they can provide detailed insights into the nature and location of the errors.

Here are some strategies to create robust error handlers in VBA:

1. Use Clear and Descriptive Error Messages: Instead of generic error prompts, provide messages that describe what went wrong and potentially how to fix it. For example:

```vba

On Error GoTo ErrorHandler

...

ErrorHandler:

MsgBox "The file could not be opened. Please check if the file is already open or if the file path is correct."

Resume Next

```

2. Anticipate Common Errors: Identify common points of failure and write specific handlers for them. For instance, if a file path is often incorrect, check the path's validity before attempting to open it.

3. Log Errors for Future Reference: Create a log file or a database entry for errors, which can be invaluable for debugging and improving the program. Example:

```vba

Open "errorlog.txt" For Append As #1

Print #1, "Error Number: " & Err.Number & " Error Description: " & Err.Description

Close #1

```

4. Use error Handling blocks Wisely: Don't wrap entire procedures in a single error handler; instead, protect only the parts of code that are likely to fail. This approach makes your code cleaner and debugging easier.

5. Provide a Way Out for the User: Always include an option for the user to exit the procedure safely if an error occurs. This prevents the program from entering an endless loop of errors.

6. Test Your Error Handlers: Just like the rest of your code, error handlers need to be tested. Simulate errors to ensure your handlers work as expected.

7. Educate Users on Error Messages: If possible, provide documentation or help files that explain common error messages and steps to resolve them.

8. Nested Error Handlers: For complex procedures, consider using nested error handlers to manage errors at different levels of the code hierarchy.

By implementing these strategies, you can ensure that your VBA programs are equipped to handle errors in a way that is both user-friendly and conducive to ongoing maintenance and development. Remember, the goal is not to write error-free code, but to write code that handles errors in a way that is transparent and manageable.

Creating Robust Error Handlers - Error Handling: Bulletproof VBA: Strategies for Effective Error Handling

Creating Robust Error Handlers - Error Handling: Bulletproof VBA: Strategies for Effective Error Handling

6. Best Practices for Anticipating Errors

Anticipating errors in VBA is akin to preparing for the unexpected; it's an essential part of creating resilient and user-friendly applications. When we talk about anticipating errors, we're referring to the proactive measures a developer takes to ensure that their program can handle potential issues gracefully. This involves not only catching errors when they occur but also designing your code in such a way that it's less likely to fail. From the perspective of a seasoned developer, this means incorporating error handling routines that can manage both known and unforeseen issues. For a user, it translates to a seamless experience where interruptions are minimized. And from a business standpoint, it's about safeguarding data integrity and maintaining productivity.

Here are some best practices for anticipating errors in VBA:

1. Use Option Explicit: At the beginning of your modules, always use `Option Explicit` to force explicit declaration of all variables. This helps catch typos and incorrect variable names that could lead to runtime errors.

2. Implement Error Handling: Use `On error GoTo` statements to redirect code execution to an error handling routine. This allows you to manage errors effectively and provide meaningful feedback to the user.

Example:

```vba

Sub SafeSubroutine()

On Error GoTo ErrHandler

' Code that might cause an error

Exit Sub

ErrHandler:

MsgBox "An error occurred: " & Err.Description

End Sub

```

3. Validate User Input: Always validate input from users before processing it. Use functions like `IsNumeric` or `Len` to check for valid data types and lengths.

4. Set Expectations with Assertions: Use `Debug.Assert` to halt code execution if a condition is false during development. This helps catch errors early in the development cycle.

5. Employ Preventive Coding Techniques: Write code that anticipates and handles potential errors, such as checking if a file exists before trying to open it, or ensuring a database connection is established before executing a query.

6. Use Enumerations for Constants: Instead of hard-coding values, use enumerations which make your code more readable and less prone to errors caused by typing incorrect values.

7. Regularly Use the Compiler: compile your code frequently to catch syntax and other compile-time errors that are easier to fix than runtime errors.

8. Implement Robust Logging: Create a logging system to record errors, which can be invaluable for troubleshooting and understanding the context in which errors occur.

9. Educate Users: Provide clear instructions and feedback to users to prevent errors caused by misunderstanding how to use the application.

10. Plan for the Worst: Assume that errors will happen and plan accordingly. For example, use transactions in database operations so you can roll back changes if an error occurs.

By integrating these practices into your VBA projects, you can create applications that not only handle errors when they arise but also reduce the likelihood of errors occurring in the first place. This proactive approach to error handling not only improves the robustness of your code but also enhances the overall user experience by providing a stable and reliable application.

Best Practices for Anticipating Errors - Error Handling: Bulletproof VBA: Strategies for Effective Error Handling

Best Practices for Anticipating Errors - Error Handling: Bulletproof VBA: Strategies for Effective Error Handling

7. Tracking and Recording Mistakes

In the realm of programming, particularly in VBA, error logging is an indispensable strategy for tracking and recording mistakes that occur during the execution of code. This process not only aids in identifying the exact location and nature of an error but also serves as a critical tool for post-mortem analysis, allowing developers to understand the circumstances under which the error occurred. By meticulously logging errors, developers can create a robust database of known issues, which can be invaluable for both immediate troubleshooting and long-term maintenance of the codebase. Error logging should be approached with a mindset that embraces the inevitability of mistakes while striving for continuous improvement and prevention.

From the perspective of a developer, error logging is akin to keeping a detailed diary of the code's behavior under various conditions. It's about creating a transparent record that can be referred back to, ensuring that the same mistake isn't made twice. For a project manager, error logs are a dashboard that reflects the health of the project, indicating areas that require attention and resources. From a user's standpoint, effective error logging translates to a smoother experience, as it leads to quicker resolutions and more stable software.

Here are some in-depth insights into error logging:

1. Error Identification: The first step is to catch errors as they occur. In VBA, this is typically done using the `On Error` statement, which can be set to `On Error GoTo Label`, `On Error Resume Next`, or `On Error GoTo 0`.

2. Logging Mechanism: Once an error is caught, it should be logged. This can be done by writing to a text file, a database, or even an error-handling object. For instance:

```vba

Sub LogError(ErrNum As Long, ErrDesc As String, ProcedureName As String)

Open "C:\ErrorLog.txt" For Append As #1

Print #1, "Error Number: " & ErrNum & " Description: " & ErrDesc & " Procedure: " & ProcedureName

Close #1

End Sub

```

3. User Notification: Informing the user about the error in a non-technical language is crucial. This can be done via message boxes or user-friendly logs that explain the error without exposing the underlying code or logic.

4. Error Resolution: The log should provide enough information for resolving the error. This includes the error number, description, and the procedure where it occurred.

5. Preventive Measures: Analyzing error logs can help in identifying patterns and taking preventive measures. For example, if a particular type of error occurs frequently, additional validation or error handling can be implemented to prevent it.

6. Continuous Monitoring: error logs should be reviewed regularly to monitor the health of the application and to ensure that error handling strategies are effective.

7. Security Considerations: Sensitive information should never be logged. Error logs should be stored securely to prevent unauthorized access.

By incorporating these strategies into your VBA projects, you can create a more resilient and reliable codebase. Remember, the goal of error logging isn't just to record errors, but to learn from them and enhance the overall quality of the software.

Tracking and Recording Mistakes - Error Handling: Bulletproof VBA: Strategies for Effective Error Handling

Tracking and Recording Mistakes - Error Handling: Bulletproof VBA: Strategies for Effective Error Handling

8. Informing Users About Errors

Effective error handling is not just about preventing crashes or debugging; it's also about clear communication with users. When an error occurs, the way it's communicated can greatly impact the user experience. Users may not understand the technical details of what went wrong, but they need to know that an error has occurred, what the general nature of the problem is, and what, if any, steps they can take next. This is particularly important in VBA (Visual Basic for Applications), where the end-user might be less technically inclined than in other programming environments.

From a developer's perspective, it's crucial to provide error messages that are informative but not overwhelming. From a user's standpoint, the message should be clear and actionable. Balancing these needs can be challenging, but it's achievable with thoughtful design. Here are some strategies for informing users about errors effectively:

1. Use Clear and Non-Technical Language: Avoid jargon that only developers would understand. For example, instead of saying "Runtime error 1004," you could say, "Oops! Something went wrong when trying to open your file."

2. Be Concise but Informative: Provide enough information so users know what happened, but keep it brief. A good balance might be, "We couldn't save your document due to a temporary network issue. Please try again in a few minutes."

3. Offer a Next Step: Whenever possible, suggest how the user can resolve the error. For instance, "The document is currently read-only. Close any other programs that might be using it and try again."

4. Log Detailed Error Information Elsewhere: Keep the user-facing message simple, but log the technical details in a file or database for debugging purposes. This way, support staff can access it if needed without overwhelming the user.

5. Categorize Errors: Differentiate between user errors, system errors, and informational messages. Color-coding or icons can help with this. For example, use a red exclamation mark for critical errors and a blue information icon for general notices.

6. Test Your Error Messages: Just like any other feature, test your error messages with real users to ensure they are clear and helpful.

7. Localize Error Messages: If your application will be used in different countries, make sure to translate the error messages appropriately.

8. Avoid Blaming the User: Phrasing is important. Instead of "You entered the wrong date format," use "The date format seems incorrect. Please use DD/MM/YYYY."

9. Use Humor Carefully: Sometimes a light-hearted message can ease frustration, but be cautious as it can also come across as dismissive.

10. Provide a Way to Contact Support: If the error is serious or persistent, offer a way for users to reach out for help.

For example, consider a situation where a user tries to access a feature that's not available in their version of the software. A poor error message might read, "Feature X is not available." A better approach would be, "Feature X is part of the Pro version. Click here to learn more about upgrading."

The goal is to make sure that users are informed about errors in a way that is helpful and empathetic. By following these strategies, you can ensure that your VBA applications handle errors in a user-friendly manner. Remember, the key is to maintain a balance between being informative and being overwhelming.

Informing Users About Errors - Error Handling: Bulletproof VBA: Strategies for Effective Error Handling

Informing Users About Errors - Error Handling: Bulletproof VBA: Strategies for Effective Error Handling

9. Preventing Errors Before They Happen

In the realm of programming, particularly in VBA, the adage "prevention is better than cure" holds a significant weight. Advanced strategies for preventing errors are not just about writing error-free code, but about creating a robust framework that anticipates and mitigates potential issues before they manifest into errors. This proactive approach to error handling is multi-faceted, involving thorough planning, strategic coding practices, and a deep understanding of the common pitfalls that can lead to bugs and glitches. By incorporating these strategies into the development process, programmers can save countless hours of debugging and ensure a smoother, more reliable user experience.

1. Anticipatory Coding: Begin by writing code that anticipates potential errors. For instance, before performing an operation that could potentially result in an error, check for preconditions. If you're about to divide by a variable, ensure it's not zero first. This preemptive check acts as a first line of defense against runtime errors.

Example:

```vba

If denominator <> 0 Then

Result = numerator / denominator

Else

' Handle the potential divide by zero error

End If

2. Data Validation: Rigorous data validation is crucial. Ensure that all inputs, whether from a user or an external source, are validated before use. This includes checking for data types, ranges, and formats. By validating data at the point of entry, you can prevent a multitude of errors related to invalid data processing.

Example:

```vba

Function IsValidDate(dateString As String) As Boolean

IsValidDate = IsDate(dateString)

End Function

3. Use of option explicit: Always use `Option Explicit` at the start of your modules. This forces the declaration of all variables, reducing the chances of errors caused by typographical mistakes in variable names.

4. Error Handling Routines: Implement comprehensive error handling routines. Use `On Error GoTo` statements to redirect code execution to a label that handles the error gracefully, providing feedback or a way to recover from the error.

Example:

```vba

On Error GoTo ErrorHandler

' Code that might cause an error

Exit Sub

ErrorHandler:

' Code to handle the error

Resume Next

5. Regular Code Reviews: Conduct regular code reviews with peers. Fresh eyes can often catch errors that the original programmer may overlook. This collaborative approach not only improves code quality but also fosters a learning environment.

6. Automated Testing: Develop automated tests for your code. Unit tests, in particular, can be very effective in catching errors early in the development cycle. They allow you to test individual parts of the code in isolation, ensuring they work as expected.

7. Documentation and Comments: Maintain clear documentation and comments within your code. Well-documented code is easier to understand, maintain, and debug. It also helps other programmers to follow the logic and identify potential error-prone areas.

By integrating these advanced strategies into your vba programming practices, you can significantly reduce the likelihood of errors occurring. It's about shifting the mindset from reactive error handling to a proactive error prevention approach, which ultimately leads to more robust and reliable applications. Remember, the goal is to think ahead, plan meticulously, and code with precision, so that errors are the exception, not the norm.

Read Other Blogs

Real Estate Operations Training: Driving Business Innovation: Real Estate Operations Training for Startups

In the dynamic world of startups, the mastery of real estate operations can be a formidable lever...

Analytical Procedures: Beyond the Numbers: Analytical Procedures in Interim Auditing

Interim auditing is a vital component of the overall audit process, typically conducted before the...

Off page optimization: Link Reclamation: Link Reclamation: Salvaging Lost Opportunities in Off page Optimization

Link reclamation is a vital component of off-page optimization that often goes unnoticed. It...

Organizational design and structure: Building Agile Structures for Entrepreneurial Ventures

Here is a possible segment that meets your requirements: Organizations are not static entities;...

Gift Wrapping Advertising: Gift Wrapping Advertising: How to Make Your Brand Stand Out in a Competitive Market

Gift wrapping is not just a way of presenting your products to your customers, but also a powerful...

Brand logo and name: Brand Identity: More Than Just a Logo

When you think of a brand, what comes to your mind? Is it the logo, the name, the colors, the...

Online business models: Virtual Events: Virtual Events: The New Meeting Ground for Online Business

In the realm of online business, virtual events have emerged as a cornerstone, transforming how...

Cash collateral margin requirements: Managing Your Investment Leverage update

Cash collateral margin requirements are an essential aspect of managing investment leverage....

User feedback: The Key to Enhancing Your Business with RatingsService

Understanding the Importance of User Feedback User feedback is an invaluable asset for any...