The following code is a RomanNumeral structure which allows you to get the roman numeral and digit representation of some number less than 5,000:
Code:
Public Structure RomanNumeral

    'Constants to hold the min/max values
    Public Const MaxValue As UInt16 = 5000
    Public Const MinValue As UInt16 = 1

    Private _numeral As String
    ''' <summary>
    ''' Gets or sets the string representation of the roman numeral
    ''' </summary>
    ''' <remarks>Sets the Value property when changed.</remarks>
    Public Property Numeral As String
        Get
            Return _numeral
        End Get
        Set(ByVal value As String)
            _numeral = value.ToUpper
            _digit = Me.ConvertToDigit
        End Set
    End Property

    Private _digit As UInt16
    ''' <summary>
    ''' Gets or sets the numeric representation of the roman numeral
    ''' </summary>
    ''' <remark1>Sets the Numeral property when changed.</remark1>
    ''' <remark2>Value cannot be less than RomanNumeral.MinValue or greater than RomanNumeral.MaxValue.</remark2>
    Public Property Digit As UInt16
        Get
            Return _digit
        End Get
        Set(ByVal value As UInt16)
            If _digit > RomanNumeral.MaxValue Then
                _digit = RomanNumeral.MaxValue
            ElseIf value < RomanNumeral.MinValue Then
                _digit = RomanNumeral.MinValue
            Else
                _digit = value
            End If

            _numeral = Me.ConvertToRomanNumeral

        End Set
    End Property

    ''' <summary>
    ''' Converts an Unassigned Short to RomanNumeral
    ''' </summary>
    ''' <param name="value">UInt16 to be converted to RomanNumeral</param>
    ''' <returns>RomanNumeral</returns>
    ''' <remarks>Allows the user to implicitly convert Short to RomanNumeral</remarks>
    Public Shared Widening Operator CType(ByVal value As UInt16) As RomanNumeral
        Return New RomanNumeral With {.Digit = value}
    End Operator

    Private Function ConvertToDigit() As UInt16
        'Store the various digits & numerals
        Dim integers() As Integer = {1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000}
        Dim numerals() As String = {"I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD", "D", "CM", "M"}
        Dim returnValue As UInt16 = 0

        'Loop through each character of the Numeral
        For x As Integer = 0 To _numeral.Length - 1
            'Get the current character being iterated on
            Dim currentChar As String = _numeral(x).ToString
            'If we're not on the last number and the numeral representation of the current character is lower than the next character then set the current character to both the current character and the immediate next character
            'This is for numerals IV, IX, XL, XC, CD, and CM
            If x < _numeral.Length - 1 AndAlso Array.IndexOf(numerals, _numeral(x).ToString) < Array.IndexOf(numerals, _numeral(x + 1).ToString) Then
                currentChar = _numeral(x) & _numeral(x + 1)
                x += 1
            End If

            'Add the digit representation of the roman numeral to the existing returnValue
            returnValue += Convert.ToUInt16(integers(Array.IndexOf(numerals, currentChar)))
        Next

        Return returnValue
    End Function

    Private Function ConvertToRomanNumeral() As String
        'Hold a temp varaiable
        Dim x As Integer = _digit

        'Store the various digits & numerals
        Dim integers() As Integer = {1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000}
        Dim numerals() As String = {"I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD", "D", "CM", "M"}
        Dim returnValue As String = String.Empty

        'Loop until the temp varirable is 0
        Do
            'Get the highest decimal value that is less than or equal to the temp variable
            Dim v As Integer = integers.LastOrDefault(Function(d) d <= x)

            'Concatenate the numeral representation of the digit
            returnValue &= numerals(Array.IndexOf(integers, v))

            'Subtract the highest decimal value from the temp value
            x -= v
        Loop Until x = 0

        Return returnValue
    End Function

    Public Overrides Function ToString() As String
        Return Me.ConvertToRomanNumeral()
    End Function

End Structure
I heavily commented inside the methods and used XML comments for the Public methods/properties so that you can see what is going on. This is probably one of the more detailed examples out there. If you have any questions or improvements, let me know!