2012-08-30 27 views
10

Tengo un archivo csv siempre llamado igual, llamado SO2PO.csv. Tiene datos que importo en una hoja Excel llamada Datos PO, en un libro de trabajo llamado Orden abierta. Necesito encontrar una manera de importar todos los datos de SO2PO.csv a la hoja de pedidos abiertos .xlsm. Datos de PO.¿Hay alguna manera de importar datos de .csv a la hoja de Excel activa?

Sé que es posible, pero ¿cómo? ¿Alguien me puede apuntar en la dirección correcta?

¿O hay una manera de hacerlo para que pueda importar cualquier archivo .csv que se coloque en una carpeta específica?

+2

odio decir esto, pero me dijo específicamente que intento esto en una hoja de Excel ... que pensé que, además de las etiquetas, Excel y Excel VBA habría indicios de que Excel es la aplicación que estaba usando y que Excel-VBA era una posibilidad ... de una solución. Si iba a hacer esto usando otra aplicación, probablemente hubiera dicho ... –

+0

Sí, era evidente que Excel era la aplicación. No era evidente el mecanismo * externo * que desea utilizar, ya sea que haya incluido la escritura de una aplicación separada e independiente en algo como C# o VB.Net, o quizás como parte de una aplicación más grande que utiliza SQL Server. Tu conoces tu sistema Nosotros no. Realmente disfruto ayudando aquí, pero las respuestas como esta cuando intento brindar la ayuda no son muy alentadoras. Buena suerte con tu proyecto. –

+1

Si iba a haber C# y VB.Net, lo pondría en las etiquetas ... Soy bastante literal cuando pido cosas. –

Respuesta

20

Añadir este código para crear un QueryTable en la hoja de datos PO al origen de datos

Una vez que haya creado el QueryTable a continuación, puede simplemente haga clic derecho actualizar los datos (o actualizar al abrir)

Sub CSV_Import() 
Dim ws As Worksheet, strFile As String 

Set ws = ActiveWorkbook.Sheets("PO Data") 'set to current worksheet name 

strFile = Application.GetOpenFilename("Text Files (*.csv),*.csv", , "Please select text file...") 

With ws.QueryTables.Add(Connection:="TEXT;" & strFile, Destination:=ws.Range("A1")) 
    .TextFileParseType = xlDelimited 
    .TextFileCommaDelimiter = True 
    .Refresh 
End With 
End Sub 
+0

¿funcionará esto con archivos xls si lo cambio también? –

+0

La única razón por la que pregunto es porque cuando trato de cambiar los archivos a xlxs o xls, se lanza una gran cantidad de extr acode. –

+1

Conectar a un archivo de Excel no es el mismo método, pero es posible usar la conexión ADO. Creo que requeriría otra pregunta para responder en lugar de aquí en el comentario. –

2

es posible.

Sin vba, utilizaría DATA-Tab e importaría desde el origen del texto.

con VBA que podría abrir el CSV como un nuevo libro:

Public Function openSource(fileToOpen As String) As Excel.Workbook 
On Error GoTo err_exit 

    Dim f As Object 
    Dim fs As Object 

    Set fs = CreateObject("Scripting.FileSystemObject") 
    Set openSource = Nothing 

    If fs.fileexists(fileToOpen) Then 
     Set f = fs.GetFile(fileToOpen) 

     Set openSource = ThisWorkbook.Application.Workbooks.Open(_ 
      FileName:=f.path, _ 
      UpdateLinks:=2, _ 
      ReadOnly:=True, _ 
      AddToMRu:=False, _ 
      Notify:=False) 

     Windows(openSource.Name).Visible = False 
    End If 
    Exit Function 
err_exit: 
    'throwErrMsg "Failed to read File!", "openSource" 
    If Not openSource Is Nothing Then 
     openSource.Close SaveChanges:=False, RouteWorkbook:=False 
    End If 
End Function 

Dim CSVWorkbook As New Excel.Workbook 
Set CSVWorkbook = openSource(c:\SO2PO.csv) 

Ahora usted puede navegar a través de este libro de trabajo como cualquier otro y copiar filas, collados o toda una hoja de cálculo;) espero que esto ayude.

Otra forma sería utilizar la importación desde el texto en la versión vba, pero no tengo un ejemplo de inmediato.

1

Hay muchas maneras de obtener datos en Excel. Querytables (como lo demuestra The_Barman), SQL, Asistente de importación, etc.

Por lo general, el método depende de cuán limpia se presentan los datos en los archivos que necesita importar y si sabe exactamente cómo está distribuido. Por ejemplo, si hay filas vacías, tipos de datos mixtos, celdas combinadas, etc., puede ser una pesadilla.

A continuación se muestra un método de "fuerza bruta" más lento que generalmente obtendrá todos los datos al abrir primero el archivo en Excel. A menudo es lo último que se puede hacer cuando otros métodos fallan.

Option Explicit 

Public Sub ImportData() 
Dim CSVFilename As String 
Dim writeToFilename As String 
Dim writeToSheet As String 
Dim readXL As Workbook 
Dim readWS As Worksheet 
Dim writeXL As Workbook 
Dim writeWS As Worksheet 
Dim UsedRng As Range 



    CSVFilename = Environ$("USERPROFILE") & "\Desktop" & "\SO2PO.csv" 
    writeToFilename = Environ$("USERPROFILE") & "\Desktop" & "\Open Order.xlsx" 
    writeToSheet = "PO Data" 


    Set writeXL = GetObject(writeToFilename) 
    Set writeWS = writeXL.Sheets(writeToSheet) 
    'writeWS.Parent.Windows(1).Visible = True 


    Set readXL = GetObject(CSVFilename) 

    With readXL 

     Set readWS = readXL.Sheets(1) 
     Set UsedRng = RealUsedRange(readWS) 
     writeWS.Range(UsedRng.Address).Value = UsedRng.Value 

    End With 

    'close CSV without saving 
    readXL.Close SaveChanges:=False 
    Set readWS = Nothing 
    Set readXL = Nothing 

    'close template with save 
    writeXL.Close SaveChanges:=True 
    Set writeWS = Nothing 
    Set writeXL = Nothing 


End Sub 


Public Function RealUsedRange(ByVal WS As Worksheet) As Range 
'Find used range 
    Dim FirstRow  As Long 
    Dim LastRow   As Long 
    Dim FirstColumn  As Integer 
    Dim LastColumn  As Integer 

    On Error Resume Next 

    With WS 

     FirstRow = .Cells.Find(What:="*", After:=.Cells(.Rows.Count, .Columns.Count), LookIn:=xlValues, LookAt:= _ 
     xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext).Row 

     FirstColumn = .Cells.Find(What:="*", After:=.Cells(.Rows.Count, .Columns.Count), LookIn:=xlValues, LookAt:= _ 
     xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext).Column 

     LastRow = .Cells.Find(What:="*", After:=.Range("A1"), LookIn:=xlValues, LookAt:= _ 
     xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row 

     LastColumn = .Cells.Find(What:="*", After:=.Range("A1"), LookIn:=xlValues, LookAt:= _ 
     xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column 

     Set RealUsedRange = .Range(.Cells(FirstRow, FirstColumn), .Cells(LastRow, LastColumn)) 

    End With 

    On Error GoTo 0 

End Function 
0

Si va a utilizar querytables, asegúrese de limpiar después, las tablas de consulta sobrantes me causaron algunos dolores de cabeza en un proceso posterior.

' get the file to the data sheet 
Set ws = ActiveWorkbook.Sheets("Data") 
With ws.QueryTables.Add(Connection:="TEXT;" & "mydata.csv", Destination:=ws.Range("A1")) 
    .TextFileParseType = xlDelimited 
    .TextFileCommaDelimiter = True 
    .Refresh 
End With 

' delete the querytable if there is one 
On Error GoTo nothingtodelete 
    Sheets("Data").QueryTables(1).SaveData = False 
    Sheets("Data").QueryTables.Item(1).Delete 
nothingtodelete: 
Cuestiones relacionadas