Es por el punto y coma que pones al final de la sentencia sql. Además debes quitar los paréntesis en la instrucción Open del recordset. En fin, prueba poniendo el código así:
Código:
Dim sql As String
If Txtfechainicio.Text = "" Or Txtfechafin.Text = "" Then
MsgBox ("Debe seleccionar un dato"), vbCritical
com_grupo.Enabled = True
Exit Sub
End If
rs1.CursorLocation = adUseClient
sql = " SELECT DATOSVISITADOR.RutVisitador, DATOSVISITADOR.DvVisitador, DATOSVISITADOR.NombreVisitador, DATOSCLIENTE.RutCliente, DATOSCLIENTE.DvCliente, DATOSCLIENTE.NombreCliente, OBSERVACIONESGENERALES.MontoCredito, OBSERVACIONESGENERALES.PlazoCredito, OBSERVACIONESGENERALES.NombrePersonaAtendio, OBSERVACIONESGENERALES.HoraVisita, OBSERVACIONESGENERALES.Fecha "
sql = sql & "FROM (DATOSCLIENTE INNER JOIN (DATOSVISITADOR INNER JOIN VISITAS ON (DATOSVISITADOR.DvVisitador = VISITAS.DvVisitador) AND (DATOSVISITADOR.RutVisitador = VISITAS.RutVisitador)) ON (DATOSCLIENTE.ID = VISITAS.ID) AND (DATOSCLIENTE.DvCliente = VISITAS.DvCliente) AND (DATOSCLIENTE.RutCliente = VISITAS.RutCliente)) LEFT JOIN OBSERVACIONESGENERALES ON (VISITAS.DvCliente = OBSERVACIONESGENERALES.DvCliente) AND (VISITAS.RutCliente = OBSERVACIONESGENERALES.RutCliente) AND (VISITAS.ID = OBSERVACIONESGENERALES.ID)"
rs1.Open sql & "WHERE OBSERVACIONESGENERALES.FECHA BETWEEN #" & Txtfechainicio & "# AND #" & Txtfechafin & "#", cnn1, adOpenDynamic, adLockOptimistic
If rs1.RecordCount > 0 Then
Call CargarDataGrid(DataGrid1)
Else
MsgBox ("no hay datos para cargar"), vbInformation
End If
Aún así, creo que la sentencia es demasiado recargada y con demasiadas comparaciones:
(DATOSCLIENTE.ID = VISITAS.ID) AND (DATOSCLIENTE.DvCliente = VISITAS.DvCliente) AND (DATOSCLIENTE.RutCliente = VISITAS.RutCliente)
¿No sería igual comparar solamente el ID? los demás campos, se supone que siempre son iguales.