Valeu Alexandre.
Faltava o select:
rs.Open "Select * from pais order by cdpais", cnn, adOpenStatic, adLockOptimistic
Segue abaixo:
Private Function Salvar() As Boolean
rs.AddNew
rs!CdPais = StrConv(txtCodigo.Text, vbUpperCase)
rs!nmpais = StrConv(txtCodigo.Text, vbUpperCase)
rs.Update
Inserir = True
Set rs = New ADODB.Recordset
rs.Open "Select * from pais order by cdpais", cnn, adOpenStatic, adLockOptimistic
Call montaCabecalho '1 - monta o cabeçalho do grid
Call CarregaGrid(rs) '2 - depois carrega os dados com o seu select
End If
Private Sub montaCabecalho()
With msfPais
.Cols = 2 'seta a quantidade de colunas - Codigo e nome
.Rows = 1 'seta com quantas linhas o grid irá inicializar
.TextMatrix(0, 0) = "Código" 'na linha 0 coluna 0 o rotulo da coluna será "CODIGO"
.ColWidth(0) = 1150 'largura da coluna CODIGO
.TextMatrix(0, 1) = "Descrição" ' na linha 0 coluna 1 o rotulo da coluna será "NOME"
.ColWidth(1) = 4300 'largura da coluna NOME
End With
End Sub
'Quando chamar essa função passe o recordset populado com seus dados
Private Sub CarregaGrid(ByRef rsSelect As ADODB.Recordset)
With msfPais
.Clear 'limpa o grid
Do While Not rsSelect.EOF
.Rows = .Rows + 1 'a cada registro novo adiciona uma nova linha
'CODIGO
.TextMatrix(0, 0) = "Código"
.TextMatrix(.Rows - 1, 0) = rsSelect!CdPais 'na coluna 0 atribui o valor da coluna CODIGO do RecordSet
.ColAlignment(0) = flexAlignLeftCenter
'NOME
.TextMatrix(0, 1) = "Descrição"
.TextMatrix(.Rows - 1, 1) = rsSelect!nmpais 'na coluna 1 atribui o valor da coluna NOME do RecordSet
.ColAlignment(1) = flexAlignLeftCenter
rsSelect.MoveNext
Loop
End With
End Sub