OK, can you replace "test" sub procedure with the below and see how it goes.
You can add/remove column(s), but Col.B & C should always stay there as the key columns.
Sub test()
    Dim fn As String, a, b, s, x, y, temp
    Dim i As Long, ii As Long, dic(1) As Object
    For i = 0 To 1
        Set dic(i) = CreateObject("Scripting.Dictionary")
        dic(i).CompareMode = 1
    Next
    a = Sheets("sheet1").[a1].CurrentRegion.Value
    b = Application.Index(a, 1, 0)
    For i = 2 To UBound(a, 1)
        If a(i, 1) <> "" Then dic(0)(a(i, 1)) = Application.Index(a, i, 0)
        If a(i, 2) <> "" Then dic(1)(a(i, 2)) = Application.Index(a, i, 0)
    Next
    fn = ThisWorkbook.Path & "\example_datasheet.csv"
    x = Split(CreateObject("Scripting.FileSystemObject").OpenTextFile(fn).ReadAll, vbNewLine)
    y = Split(CleanCSV(x(0), Chr(2), Chr(3)), ",")
    For ii = 1 To UBound(b)
        b(ii) = Application.Match(Replace(b(ii), ",", Chr(2)), y, 0)
        If IsError(b(ii)) Then MsgBox "Field " & a(1, ii) & " is missing", vbCritical: Exit Sub
        b(ii) = b(ii) - 1
    Next
    For i = 1 To UBound(x)
        If x(i) <> "" Then
            y = Split(CleanCSV(x(i), Chr(2), Chr(3)), ",")
            For ii = 0 To 1
                s = Replace(y(b(ii + 1)), Chr(2), ",")
                If dic(ii).exists(s) Then temp = dic(ii)(s)
            Next
            If IsArray(temp) Then
                For ii = 1 To UBound(b)
                    If temp(ii) Like "*,*" Then temp(ii - 1) = Chr(34) & temp(ii - 1) & Chr(34)
                    y(b(ii)) = temp(ii)
                Next
            End If
            x(i) = Replace(Replace(Join(y, ","), Chr(2), ","), Chr(3), """")
        End If
    Next
    fn = Replace(fn, ".csv", "_Updated.csv")
    Open fn For Output As #1
        Print #1, Join(x, vbNewLine);
    Close #1
    ImportCSV fn
End Sub