2016-02-25 2 views
3

У меня есть следующий лист имеющихся в моей книгеКак использовать ВПР и получить информацию из другого листа с помощью VBA

test,input,model,cm,mm,output 

Я хотел бы получить информацию от входного листа.

  1. добавить столбец перед испытательной колонкой, которая является «отметкой» и «vlookup», основанной на доме (,), на листе «CM» для маркировки.
  2. мне нужно получить «дорогой» деталь из «СМ», основанный дом
  3. Мне нужно, чтобы «сын» деталь из «ММ», основанный дом
  4. Мне нужно добавить столбец между братом и сыном. Который назван как mark и vlook, основанный на сыне, и получить от листа модели.

Входной

test mail god house dear moon son brother loosee man boy girl test 
dd d d sd dfd 123 dfd ad d df sd d d 


model            
pop mark            
123 jklm            
CM            
house dear mark           
sd dfd love           
MM            

moon son           
123 dfd           

Я пытаюсь написать следующий код, чтобы получить все детали и получить выход. но я получаю неудачные PLS, чтобы помочь мне решить эту проблему.

Option Explicit 

Sub CopyRows() 
    Dim ws1 As Worksheet, ws2 As Worksheet 
    Dim i As Integer, k As Integer 
    Dim ws1LR As Long, ws2LR As Long 

    Set ws1 = Sheets("input") 
    Set ws2 = Sheets("output") 

    ws1LR = ws1.Range("A" & Rows.Count).End(xlUp).Row + 1 
    ws2LR = ws2.Range("A" & Rows.Count).End(xlUp).Row + 1 

    i = 2 
    k = ws2LR 
    Do Until i = ws1LR 
     With ws1 
      .Range(.Cells(i, 1), .Cells(i, 18)).Copy 
     End With 

     With ws2 
      .Cells(k, 1).PasteSpecial 
      .Cells(k, 1).Offset(1, 0).PasteSpecial 
     End With 

     k = k + 2 
     i = i + 1 
    Loop 
End Sub 
+1

не мог понять вашу точную цель. пожалуйста, дайте реальный пример стартовых и окончательных листов. – user3598756

+0

Хороший первый шаг, включите автозагрузчик и выполните шаги вручную. Это позволит вам многое из того, что вам нужно для автоматизации задачи в VBA. –

ответ

0

Я думаю, что самый простой способ для достижения ваших целей:

Sub prueba() 


    Const adOpenStatic = 3 
    Const adLockOptimistic = 3 
    Const adCmdText = &H1 

    Dim point2 As String 
    Dim point3 As String 

    Dim query As String 

    Set objConnection = CreateObject("ADODB.Connection") 
    Set objRecordset = CreateObject("ADODB.Recordset") 

    objConnection.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _ 
     "Data Source=C:\Users\Daniel\Desktop\prueba.xlsx;" & _ 
      "Extended Properties=""Excel 8.0;HDR=Yes;"";" 

    query = "Select cm.dear FROM [input$] as i inner join [cm$] as cm on i.house = cm.house where test is not null" 

    objRecordset.Open query, _ 
     objConnection, adOpenStatic, adLockOptimistic, adCmdText 

    'since query returns one row so: 

    point2 = objRecordset.Fields.Item("dear") '<---- returns "dfd" 

    objRecordset.Close 

    query = "Select mm.moon FROM [input$] as i inner join [mm$] as mm on i.house = mm.house where test is not null" 

    'following line cant return any value because there is not any house field on mm table 
    objRecordset.Open query, _ 
     objConnection, adOpenStatic, adLockOptimistic, adCmdText 

    point3 = objRecordset.Fields.Item("moon") 


End Sub 

Все, что вы должны знать об этом коде, как написать правильный запрос.

Обратите внимание на переменную запроса, это как запрос sql, вы можете присоединиться к нескольким таблицам и найти значение, в котором эти два значения в двух полях (столбцах) равны. Это потому, что вы не можете запустить второй запрос, потому что в таблице mm нет поля, называемого house (в соответствии с вашим примером).

Смежные вопросы