Mastering VBA ReDim: VBA ReDim Cheat Sheet PDF! [2024]

Mastering VBA ReDim: What is The Difference Between Dim and ReDim?

What does VBA ReDim mean in VBA? In the intricate world of Visual Basic for Applications (VBA), the mastery of data management is a pivotal skill for crafting efficient and powerful applications. At the heart of dynamic data manipulation lies the VBA ReDim statement, a tool indispensable for its ability to resize arrays dynamically, providing flexibility and adaptability in data handling. This comprehensive guide ventures into the depths of VBA ReDim, shedding light on its capabilities from resizing VBA ReDim 2-dimensional arrays to exploring the subtleties of VBA Dim types. By placing a strong emphasis on tips, tricks, and important parts, this article aspires to equip you with the profound understanding necessary to utilize VBA ReDim to its fullest potential within your VBA projects.

Expanding arrays dynamically is a common requirement in VBA programming, especially when the exact size of data collections is not known at compile time. The ReDim statement allows programmers to declare arrays dynamically and resize them as needed, ensuring efficient memory use and flexibility in data management. This feature is particularly useful in scenarios where data sets are subject to change, such as when importing data from external sources or when dealing with user-generated content.

Understanding VBA ReDim 2-dimensional arrays is crucial for developers working with complex data structures. These arrays offer the ability to store data in a tabular form, making them ideal for operations that involve matrices or spreadsheet-like data. However, managing two-dimensional arrays with ReDim requires careful consideration, especially when preserving existing data with ReDim Preserve.

Click and Download! vba cheat sheet pdf

VBA ReDim for 2-Dimensional Arrays: A Comprehensive Guide

In the intricate world of VBA (Visual Basic for Applications) programming, the art of manipulating dynamic data structures is indispensable. Among these, the ability to use ReDim for resizing 2-dimensional arrays is particularly significant, showcasing remarkable flexibility. This feature becomes crucial when dealing with matrix-like data sets, where adjustments to the size of a 2D array are frequently needed. ReDim provides the essential functionality to dynamically modify the dimensions of an array. However, this power comes with a caveat: a meticulous approach is required, especially with multi-dimensional arrays, as overlooking the proper use of the Preserve keyword can lead to the loss of existing data within the array.

Takeaway: The Power and Flexibility of ReDim

The primary takeaway from learning about ReDim is understanding its role in enhancing the adaptability of VBA applications. With ReDim, you can efficiently manage memory by allocating just as much space as needed for your arrays at any point in your program’s execution. This ability not only contributes to more efficient use of resources but also opens up possibilities for handling complex data manipulation tasks that would be difficult or impossible with statically-sized arrays.

However, it’s essential to use VBAReDim wisely, especially when preserving data with VBA ReDim Preserve. Each time you use VBA ReDim Preserve to resize an array, VBA needs to allocate new memory for the resized array and copy data from the old array to the new one. This process can impact performance, particularly with large arrays or frequent resizing operations. Therefore, strategic planning of when and how to resize arrays can significantly affect the efficiency and performance of your VBA applications.

In summary, VBA ReDim offers a powerful tool for dynamic array resizing, providing VBA programmers with unparalleled flexibility in data management. By mastering VBAReDim and using it judiciously, you can create VBA applications that efficiently adapt to varying data requirements, making your programs more robust and versatile.

In-Depth Strategies and Tips:

Handling ReDim Preserve with Precision: The VBA ReDim Preserve syntax is designed to resize only the last dimension of an array. This limitation necessitates a thorough examination of your array’s structure before applying VBA ReDim Preserve. For example, consider you have a 2D array initially declared as Dim arr(5, 10). If you attempt to resize it to ReDim Preserve arr(5, 15), you’ll successfully expand the second dimension while preserving data. However, attempting to resize the first dimension, like VBAReDim Preserve arr(10, 10), would not be permissible and would require a different approach.

Example of Efficient Data Management: To optimize the management of 2D arrays, especially when resizing is involved, consider employing a temporary array. This method involves creating a temporary copy of the original array, resizing the original array as needed, and then transferring the data back from the temporary array. This process ensures data integrity is maintained throughout the operation.

Sub ResizeArray()
Dim OriginalArray(5, 10) As Integer
Dim TempArray() As Integer
' Fill OriginalArray with data...
‘ Copy OriginalArray to TempArray
TempArray = OriginalArray
‘ Resize OriginalArray to new dimensions
ReDim OriginalArray(10, 15)

‘ Transfer data from TempArray back to OriginalArray
For i = LBound(OriginalArray, 1) To UBound(TempArray, 1)
For j = LBound(OriginalArray, 2) To UBound(TempArray, 2)
OriginalArray(i, j) = TempArray(i, j)
Next j
Next i
End Sub

Key Considerations:

Understanding ReDim Preserve’s Limitations: A deep understanding of VBA ReDim Preserve’s limitations is essential to avoid unintended data loss. Since it only allows resizing the last dimension of an array, developers need to plan their data structures accordingly or resort to more complex data handling strategies when adjustments to other dimensions are required.

Leveraging Looping Mechanisms for Data Integrity: In cases where it’s necessary to resize multiple dimensions of an array, using looping mechanisms becomes invaluable. This involves iterating through each element of the array and manually transferring data. This method, albeit more labor-intensive, grants precise control over the data transfer process, ensuring that each piece of data is accurately preserved.

Sub ManualDataTransfer()
Dim OriginalArray(5, 5) As Variant
Dim NewArray(10, 10) As Variant
' Assuming OriginalArray is already filled with data.
‘ Manual transfer of data to NewArray
For i = LBound(OriginalArray, 1) To UBound(OriginalArray, 1)
For j = LBound(OriginalArray, 2) To UBound(OriginalArray, 2)
NewArray(i, j) = OriginalArray(i, j)
Next j
Next i
‘ OriginalArray can now be resized or discarded as needed.
End Sub

By embracing these detailed strategies and examples, VBA programmers can adeptly manage the resizing of 2-dimensional arrays, ensuring data integrity, and enhancing the adaptability of their applications to meet evolving data structure needs.

Converting VBA Arrays to Excel Ranges: Techniques and Best Practices

In the realm of Excel VBA programming, the conversion of VBA arrays to worksheet ranges is a pivotal skill that bridges the gap between in-memory data structures and Excel’s grid-like interface. This capability is crucial for efficient data manipulation and presentation within Excel sheets, allowing programmers to rapidly populate or update large swathes of data with minimal performance overhead.

Effective Strategies and Insights:

Utilizing the Range().Value Property: The .Value property of a Range object is your primary tool for transferring the contents of an array directly into a worksheet range. This method is highly efficient, as it minimizes the interaction with the Excel object model, thereby speeding up data transfer operations significantly.

Matching Range Size with Array Dimensions: When working with multi-dimensional arrays, it’s imperative to ensure that the target range’s size precisely matches the array’s dimensions. Failing to do so can lead to runtime errors, as Excel cannot correctly map the array data to the cells within the range. For a two-dimensional array defined as Dim MyArray(1 To 5, 1 To 3), you should select a range that is five rows by three columns in size.

Core Techniques:

Syntax Mastery for Array-to-Range Assignment: Understanding the correct syntax for assigning the values of an array to a range is fundamental. The approach varies slightly between single and multi-dimensional arrays but generally involves specifying the target range and assigning the array directly to its .Value property.

For a single-dimensional array, you might use:

Sub ArrayToRangeSingle()
Dim MyArray As Variant
MyArray = Array("A", "B", "C", "D", "E") ' Define the array
Range("A1:A5").Value = Application.Transpose(MyArray) ' Assign to range
End Sub

For a multi-dimensional array, the process is similarly straightforward, provided the dimensions match:

Sub ArrayToRangeMulti()
Dim MyArray(1 To 2, 1 To 3) As Variant
' Populate the array with values
MyArray(1, 1) = "A"
MyArray(1, 2) = "B"
MyArray(1, 3) = "C"
MyArray(2, 1) = "D"
MyArray(2, 2) = "E"
MyArray(2, 3) = "F"
' Assign to range
Range("A1:C2").Value = MyArray
End Sub

Leveraging the Transpose Function: The Transpose function can be invaluable for rotating the orientation of your data when transferring it from an array to a range. This is particularly useful for single-dimensional arrays where you may need to switch between horizontal and vertical data presentation. The Application.Transpose method effectively flips the array’s dimensions, allowing for flexible data manipulation.

In-Depth Examples:

Example of Transposing Data: Consider a scenario where you have a single-dimensional array that you wish to transpose from a vertical to a horizontal layout (or vice versa) within an Excel sheet:

Sub TransposeExample()
Dim SingleArray As Variant
SingleArray = Array(1, 2, 3, 4, 5) ' Horizontal data in array
' Transpose and assign to a vertical range
Range("A1:A5").Value = Application.Transpose(SingleArray)
End Sub

Through mastering these techniques and applying the provided tips, VBA programmers can efficiently transfer data between arrays and Excel ranges, enhancing the capability to manipulate and present data within Excel sheets effectively. This skill set is essential for developing advanced Excel applications that require dynamic data handling and presentation.

Mastering Variant Data Types in VBA: Flexibility and Performance

In the versatile world of VBA (Visual Basic for Applications), the Variant data type stands out for its unparalleled flexibility. Capable of holding any type of data, Variants are a powerful tool for programmers, especially when dealing with arrays of unknown or mixed data types. Their ability to dynamically adapt to the data they store makes them indispensable in certain scenarios. However, this flexibility comes with its nuances, including considerations for performance and the need for robust error checking.

Strategic Insights and Best Practices:

Leveraging Variants for Dynamic Data Handling: Variants are particularly advantageous when you need to handle data types that are determined at runtime. Their capacity to store different types of data in the same array allows for a level of flexibility that is unmatched by other data types. For example, a Variant can easily store integers, strings, and even objects within the same array. This makes Variants ideal for functions that return data of an unpredictable nature, such as results from database queries or dynamic user inputs.

Performance Considerations: While the adaptability of Variants is a significant asset, it’s essential to use them judiciously due to their impact on performance. Variants consume more memory than other data types and can lead to slower execution times when used extensively or inappropriately. Therefore, it’s advisable to use more specific data types whenever possible and reserve Variants for situations where their flexibility is explicitly required.

Key Techniques:

Balancing Flexibility with Performance: The decision to use Variants should be informed by the need for flexibility versus the importance of application performance. In scenarios where the data type is known in advance, opting for a more specific type can enhance efficiency. However, in cases where the data type is dynamic or mixed within an array, Variants offer a practical solution that can simplify code and reduce complexity.

Implementing Effective Error Checking: Given the dynamic nature of Variants, implementing comprehensive error checking is crucial. Variants can store a wide range of data types, including objects and error values. This versatility necessitates thorough validation and type checking to prevent runtime errors and ensure data integrity. Utilizing functions like IsNumeric, IsArray, IsError, and TypeName can help identify the stored data type and facilitate appropriate handling.

In-Depth Example:

Using Variants with Dynamic Arrays: Consider a function that retrieves a mix of text and numerical data from a database, where the exact composition of the data is unknown until runtime. A Variant array can seamlessly handle this diversity:

Function RetrieveMixedData() As Variant
Dim MixedData As Variant
' Assume GetDataFromDatabase returns a mix of integers and strings
MixedData = GetDataFromDatabase()
If Not IsEmpty(MixedData) Then
For i = LBound(MixedData) To UBound(MixedData)
‘ Perform type checking and handle each item accordingly
Select Case TypeName(MixedData(i))
Case “Integer”, “Double”, “Currency”
‘ Handle numeric data
Case “String”
‘ Handle string data
Case Else
‘ Handle other types or raise an error
End Select
Next i
End If

RetrieveMixedData = MixedData
End Function

This example underscores the importance of Variants in managing dynamically typed data and illustrates the necessity of incorporating robust error checking to navigate the complexities of such flexibility effectively.

By understanding when and how to use Variant data types in VBA, developers can harness their full potential, balancing the trade-offs between flexibility and performance, and ultimately crafting more robust and adaptable applications.

Navigating VBA Dim Types: A Guide to Efficient Variable Declaration

In the realm of VBA (Visual Basic for Applications), understanding the diverse array of Dim types is essential for the correct declaration of variables and arrays. The choice of data type, ranging from Integer to Variant, plays a critical role in influencing both memory usage and application performance. By selecting the most suitable data type for your needs, you can ensure that your VBA programs are both efficient and effective.

Strategic Approaches and Best Practices:

Optimizing Memory Usage Through Appropriate Data Type Selection: The cornerstone of efficient VBA programming lies in choosing the correct data type for your variables. Each data type has its own memory footprint and performance characteristics. For instance, an Integer requires less memory than a Long and is suitable for smaller numerical values. On the other hand, a String can accommodate textual data of varying lengths, but its memory usage is proportional to its length. By carefully selecting the data type that best matches the nature of your data, you can optimize your program’s memory consumption.

Leveraging Dim for Array Declarations: Dim is not only useful for declaring simple variables but also plays a pivotal role in defining arrays. Whether you need a single-dimensional array for a straightforward list of values or a multi-dimensional array for more complex data structures, Dim allows you to specify both the type and dimensions of your array, thus providing a foundation for organized and accessible data storage.

Core Techniques:

Mastering VBA Data Types: A deep understanding of the various data types available in VBA is crucial. Here’s a brief overview of some common types:

  • Integer: Best for numerical values that are within the range of -32,768 to 32,767.
  • Long: Suitable for larger integers (-2,147,483,648 to 2,147,483,647).
  • Single and Double: Use these for floating-point numbers, with Double offering more precision.
  • String: Ideal for textual data.
  • Boolean: Represents True or False values.
  • Variant: A flexible type that can store any kind of data, including special values like Empty and Null.

Declaring Arrays with Dim: When declaring an array, the syntax varies slightly depending on whether you’re working with a single-dimensional or multi-dimensional array. Here’s how you can declare both types:

  • Single-Dimensional Array: Dim MyArray(0 To 9) As Integer declares an array of ten integers.
  • Multi-Dimensional Array: Dim MyMatrix(0 To 9, 0 To 9) As Double declares a 10×10 matrix suitable for storing double-precision floating-point numbers.

In-Depth Example:

Practical Application of Dim in Array Declarations: Consider a scenario where you need to store the monthly rainfall measurements for a year. You could use a single-dimensional array for this purpose:

Dim MonthlyRainfall(1 To 12) As Single

For a more complex example, imagine you’re tracking the same measurements across multiple locations. A multi-dimensional array can efficiently handle this data:

Dim LocationRainfall(1 To 5, 1 To 12) As Single

This array declaration creates a structure where you can store rainfall data for five different locations throughout the year, illustrating how the thoughtful use of Dim and data types can accommodate diverse programming needs.

By embracing these strategies and practices, VBA programmers can significantly enhance their ability to declare variables and arrays correctly, leading to programs that are both memory-efficient and performant. Through the judicious use of Dim types, developers can navigate the complexities of data storage in VBA, ensuring that their applications are robust, reliable, and ready to tackle a wide array of challenges.

Implementing Lists in VBA: Arrays vs Collections

While VBA (Visual Basic for Applications) does not inherently include a list data structure as found in many other programming languages, the functionality of lists can be effectively emulated using arrays or collections. Lists are instrumental for managing ordered data that requires frequent access and modification. Depending on your specific needs—whether it’s for ease of use or performance optimization—both arrays and collections offer viable pathways to create list-like structures in VBA.

Strategies for Emulating Lists in VBA:

Utilizing Collections for Dynamic Lists: Collections in VBA provide a flexible, dynamic environment for list emulation. They naturally support operations such as adding, removing, and iterating over items, akin to working with lists in more abstracted languages. Collections are particularly advantageous for scenarios where the size of the dataset cannot be predetermined or when it’s subject to change. They allow for dynamic resizing and straightforward data manipulation, making them an excellent choice for many applications.

Opting for Arrays for Performance-Centric Lists: Static arrays, on the other hand, are more suited for situations where the size of the list is known in advance and remains constant. While arrays in VBA do not inherently support dynamic resizing or easy item removal as collections do, they are generally more performant for fixed-size data sets due to lower memory overhead and faster access times. For lists whose size can vary, dynamic arrays with the VBAReDim statement can be used, though this introduces additional complexity and potential performance implications compared to collections.

Key Considerations:

Balancing Between Arrays and Collections: Choosing between arrays and collections for your VBA list implementation hinges on understanding the trade-offs involved. Collections offer ease of use and flexibility at the expense of some performance overhead, especially with large data sets. Arrays, especially static ones, offer performance advantages but lack the dynamism and built-in functionality of collections. Your choice should be informed by the specific requirements of your project, including the expected size of the data set, the frequency of data modification, and performance considerations.

Techniques for Managing Lists:

  • Iterating Over Lists: Both arrays and collections can be iterated over using For Each loops in VBA, allowing for straightforward data access and manipulation.
  • Adding Items: Collections allow items to be added with the .Add method, while arrays may require the use of ReDim Preserve to adjust size before adding new elements.
  • Removing Items: Collections provide a .Remove method for directly removing items. In arrays, removing items typically involves shifting elements and possibly using VBAReDim Preserve to shrink the array size.

In-Depth Example:

Example of Using a Collection as a List:

Sub DemonstrateCollectionList()
Dim myList As Collection
Set myList = New Collection
‘ Adding items to the collection
myList.Add “Item 1”
myList.Add “Item 2”
myList.Add “Item 3”

‘ Iterating over the collection
Dim item As Variant
For Each item In myList
Debug.Print item
Next item

‘ Removing an item
myList.Remove 1 ‘ Removes “Item 1”
End Sub

This example showcases the simplicity of using collections to emulate list behavior, demonstrating how items can be easily added, iterated over, and removed.

By carefully selecting between arrays and collections based on the requirements of your VBA project, you can effectively implement list-like functionality to manage ordered data efficiently. Understanding the strengths and limitations of each approach will enable you to make informed decisions that optimize both performance and ease of use in your VBA applications.

FAQs About ReDim in VBA

What does ReDim mean in VBA?

ReDim in VBA (Visual Basic for Applications) stands for Redimension. It is used to dynamically resize arrays that have already been declared. This is particularly useful when the size of the array cannot be determined at the time of its initial declaration or when the array size needs to change during runtime.

How do you use ReDim?

To use VBAReDim, you must have already declared an array using the Dim statement without specifying its size or by using a dynamic array declaration. You can then resize the array using VBA ReDim as follows:

Dim MyArray() As Integer
ReDim MyArray(5)

This code snippet first declares a dynamic array and then resizes it to hold six elements (0 through 5).

What is the difference between Dim and ReDim?

Dim is used for declaring variables and arrays, setting up their type but not necessarily their size (in the case of dynamic arrays). VBAReDim, on the other hand, is specifically used to resize dynamic arrays after they have been declared. Dim is used once for a variable or array declaration, while VBAReDim can be used multiple times to change the array’s size as needed during runtime.

What is ReDim Preserve?

ReDim Preserve is a variation of VBAReDim that resizes an array while preserving the data already stored in the array. Without Preserve, resizing an array with VBAReDim would result in the loss of its existing data. For example:

Dim MyArray(4) As Integer
' Populate the array...
ReDim Preserve MyArray(6)

This code resizes the array to hold seven elements, keeping any data that was in the original array.

How to use VBA code?

To use VBA code, you typically need to open the VBA Editor in an Office application like Excel by pressing Alt + F11. You can then insert a new module and type your VBA code into the code window. To run your code, you can press F5 or use the Run button.

How to use an image in VBA?

To use an image in VBA, particularly in user forms or on worksheets, you can use the Image control for user forms or the Shapes or Pictures collection for worksheets. For instance, to add an image to a worksheet in Excel:

ActiveSheet.Pictures.Insert("C:\Path\To\Your\Image.jpg")

Why does VBA use dim? 

In Visual Basic for Applications (VBA), the Dim statement plays a fundamental role in the declaration of variables, serving as the cornerstone for efficient and error-free programming. Understanding the nuances of using Dim to declare variables and set their data types is essential for any VBA programmer aiming to write robust and maintainable code.

The Importance of Specific Data Types

When you declare a variable using Dim, specifying its data type is crucial. This practice is not just a formality; it directly influences how VBA allocates memory for the variable. Different data types require different amounts of memory, and by explicitly stating the data type, VBA can optimize memory usage, ensuring that your program runs as efficiently as possible. For instance, an Integer type requires less memory than a Long type, making Integer a better choice for smaller numerical values.

Beyond memory optimization, specifying data types enhances type safety. For example, attempting to perform mathematical operations on a String type variable will lead to errors. By declaring variables with specific data types, you help VBA to catch these types of errors at compile time rather than at runtime, significantly reducing debugging time and improving the reliability of your code.

Improving Code Readability and Maintenance

Using Dim effectively also plays a pivotal role in enhancing code readability and maintenance. A well-documented codebase, where each variable’s purpose and type are clear, is much easier to understand and modify. This practice is particularly beneficial in collaborative environments or when returning to your own code after some time. It allows you and others to quickly grasp the function and intention of each variable, facilitating easier updates and modifications.

Moreover, declaring variables with Dim at the beginning of procedures or modules helps in creating a structured and organized code layout. This organization makes it easier to track which variables are in use, their scope, and their data types, contributing to a cleaner and more maintainable codebase.

Best Practices for Using Dim in VBA

  1. Declare Variables Explicitly: Always use Dim to declare variables explicitly before using them. This approach not only prevents typing errors but also ensures that your code adheres to best practices for data handling.
  2. Choose Data Types Wisely: Select the most appropriate data type for your variables based on their intended use. This selection affects memory usage and program performance.
  3. Scope Appropriately: Understand the scope of variables declared with Dim. Variables declared within a procedure are local to that procedure, while those declared at the module level (outside any procedure) are available to all procedures within the module.
  4. Use Descriptive Names: Combine Dim with meaningful variable names to enhance code readability. For example, Dim totalSales As Double clearly indicates that the variable stores a numerical value representing total sales.

By mastering the use of Dim in VBA, you lay a solid foundation for writing clean, efficient, and error-free code. Embracing these practices not only bolsters your programming skills but also contributes to the development of high-quality VBA applications that stand the test of time.

What is the difference between ReDim and ReDim preserve?

The key difference between VBA ReDim and VBAReDim Preserve lies in data preservation. VBAReDim resizes an array but does not keep the array’s existing data, essentially resetting it. ReDim Preserve, however, resizes the array while retaining all the data that was in the array prior to resizing, up to the new size of the array. This is critical when you need to expand an array without losing the data already stored in it.

How to Find Array Size in VBA? Changing Array Size and Maximum Limits – projectcubicle

Conclusion

Harness Dynamic Arrays with Ease

Mastering the VBA ReDim statement in VBA ReDim  can significantly enhance your programming capabilities. It opens the door to dynamic array management, essential for creating efficient applications. By applying the discussed tips and strategies, you’ll soon leverage VBA arrays’ full potential. Practice is crucial, so explore the provided examples and seek new optimization methods for your projects.

Elevate Your Skills with ProjectCubicle

Discover Advanced Techniques

ProjectCubicle.com is an invaluable resource for anyone looking to deepen their VBA knowledge. It offers a wide range of articles and tutorials that cater to various learning needs. Whether you aim to tackle complex programming issues or explore new VBA features, ProjectCubicle.com has you covered.

Join a Community of Experts

Engage with ProjectCubicle.com to enhance your programming skills further. This platform allows you to connect with a community passionate about project management and software development. Here, knowledge sharing and peer learning are paramount.

Continue Your Learning Journey

Don’t stop here. Visit projectcubicle.com to access more resources, join discussions, and elevate your VBA ReDim skills. Let your curiosity guide you to new discoveries in VBA and beyond. projectcubicle.com is your companion on this journey, offering insights and support every step of the way.

Dear ProjectCubicle Readers,

In recent times, we’ve noticed a slight dip in our readership, and as a community built on the foundation of sharing knowledge and fostering growth, we want to address this openly and sincerely. First and foremost, we want to express our heartfelt gratitude to each of you. Your engagement, curiosity, and thirst for knowledge have been the driving force behind ProjectCubicle since day one.

We understand that the world is constantly changing, and with it, the interests and needs of our readers evolve.

To do this, we need your help. We invite you to share your thoughts with us:

  • What topics are you most interested in?
  • How can we make our content more valuable and relevant to you?
  • Are there specific challenges you’re facing that you’d like us to explore?

Your feedback is invaluable to us. It will guide us in refining our content strategy and ensuring that ProjectCubicle remains a vibrant and useful resource for you. We are here to support your growth, to illuminate your path with knowledge, and to inspire innovation.

Let’s embark on this journey of rediscovery together. Let’s dive into new topics, tackle new challenges, and continue to build this community of curious minds and passionate professionals. Your voice matters to us, and we are listening.

Thank you for being a part of our community. Together, we can turn this moment into an opportunity for growth, learning, and renewed engagement.

Warm regards,

The ProjectCubicle Team

0 Comments

Leave a reply

Your email address will not be published. Required fields are marked *

*

ALL TOPICS

Log in with your credentials

Forgot your details?