返回列表 上一主題 發帖

[發問] 利用儲存格中的部分關鍵字,取出同一列的相關資料

[發問] 利用儲存格中的部分關鍵字,取出同一列的相關資料

想了好久,還是沒頭緒,寫得亂七八糟。附檔中有詳細說明,求解!
test.rar (12.86 KB)
Jess

回復 1# jesscc
  1. Sub Test()
  2.     Dim D As Object, Ky As Variant
  3.     Set D = CreateObject("Scripting.Dictionary")
  4.     With Sheets("DATA")
  5.         For Each Ky In Range(.[B5], .[B5].End(xlDown))
  6.             D(Ky.Value) = Array(Ky.Offset(0, 2), Ky.Offset(0, 4))
  7.             '=> D(Ky.Value) =Array( Ky.Cells(1, 3), Ky.Cells(1, 5))
  8.             '=> D(Ky.Value) = Array(Ky(1, 3), Ky(1, 5))
  9.         Next
  10.     End With
  11.     With Sheets("Sheet2")
  12.         If .Range("E7").End(xlDown).Row = Rows.Count Then Exit Sub
  13.         For Each Ky In .Range(.[E7], .[E7].End(xlDown))
  14.           If D.Exists(Ky.Value) Then
  15.             If D(Ky.Value)(1) Like "*C" Then
  16.                 Ky.Offset(0, 7) = D(Ky.Value)(0)  '=> .Cells(E.Row, "L")= D(Ky.Value)(0)
  17.                 If Ky.Offset(0, 8) = "" Then   'Range("O7:O" & yRow).Formula = "=N7*1000/L7"
  18.                     Ky.Offset(0, 10) = Ky.Offset(0, 9) * 1000 / Ky.Offset(0, 7)
  19.                     '=> .Cells(e.Row, "O")=.Cells(e.Row, "N")*1000/.Cells(e.Row, "L")
  20.                 Else     'Range("O7:O" & yRow).Formula = "=M7*L7"
  21.                     Ky.Offset(0, 10) = Ky.Offset(0, 8) * Ky.Offset(0, 7)
  22.                     '=> .Cells(E.Row, "O") = .Cells(E.Row, "M") * .Cells(E.Row, "L")
  23.                 End If
  24.             End If
  25.           End If
  26.         Next
  27.     End With
  28. End Sub
複製代碼
  1. Sub Ex()
  2.     Dim Ar(), E As Range, W As Variant
  3.     With Sheets("DATA")
  4.         Ar = .Range("B5:F" & .[B4].End(xlDown).Row).Value
  5.     End With
  6.     Ar = Application.WorksheetFunction.Transpose(Ar)
  7.     With Sheets("SHEET2")
  8.         For Each E In .Range("E7", .[E7].End(xlDown))
  9.             W = Application.Match(E, Application.Index(Ar, 1), 0)
  10.             If IsNumeric(W) Then
  11.                 If Application.Index(Ar, 5)(W) Like "*C" Then
  12.                     .Cells(E.Row, "L") = Application.Index(Ar, 3)(W)
  13.                     If .Cells(E.Row, "M") = "" Then     'Range("O7:O" & yRow).Formula = "=N7*1000/L7"
  14.                         .Cells(E.Row, "O") = .Cells(E.Row, "N") * 1000 / .Cells(E.Row, "L")
  15.                     Else                                 'Range("O7:O" & yRow).Formula = "=M7*L7"
  16.                         .Cells(E.Row, "O") = .Cells(E.Row, "M") * .Cells(E.Row, "L")
  17.                     End If
  18.                 End If
  19.             End If
  20.         Next
  21.     End With
  22. End Sub
複製代碼
  1. Sub Ex1()
  2.     Dim Ar(), Ay(), i As Integer, W As Variant
  3.     With Sheets("DATA")
  4.         Ar = .Range("B5:F" & .[B4].End(xlDown).Row).Value
  5.     End With
  6.     Ar = Application.WorksheetFunction.Transpose(Ar)
  7.     With Sheets("SHEET2")
  8.         Ay = .Range("E7:O" & .[E7].End(xlDown).Row).Value
  9.         For i = 1 To UBound(Ay)
  10.             W = Application.Match(Ay(i, 1), Application.Index(Ar, 1), 0)
  11.             If IsNumeric(W) Then
  12.                 If Application.Index(Ar, 5)(W) Like "*C" Then
  13.                     Ay(i, 8) = Application.Index(Ar, 3)(W)
  14.                     If Ay(i, 9) = "" Then   'Range("O7:O" & yRow).Formula = "=N7*1000/L7"
  15.                         Ay(i, 11) = Ay(i, 10) * 1000 / Ay(i, 8)
  16.                     Else                    'Range("O7:O" & yRow).Formula = "=M7*L7"
  17.                         Ay(i, 11) = Ay(i, 9) * Ay(i, 8)
  18.                 End If
  19.                 End If
  20.             End If
  21.         Next
  22.          .Range("E7:O" & .[E7].End(xlDown).Row) = Ay
  23.     End With
  24. End Sub
複製代碼

TOP

回復 2# GBKEE


    謝謝G大一次教我三種作法,第一種作法我比較能看得懂。其中的第十八行,如果除數為0的時候,程式會出現除錯,要如何避免這種情形? 還有我要用Rounddown將計算結果無條件取至整數,該如何套用?
Jess

TOP

回復 3# jesscc

  1. If Ky.Offset(0, 8) = "" And Ky.Offset(0, 9) <> "" Then
  2.            Ky.Offset(0, 10) = Int(Ky.Offset(0, 9) * 1000 / Ky.Offset(0, 7))
  3. ElseIf Ky.Offset(0, 8) <> "" Then     
  4.           Ky.Offset(0, 10) = Int(Ky.Offset(0, 8) * Ky.Offset(0, 7))
  5. End If
複製代碼

TOP

回復 4# GBKEE
了解
Round、RoundUp、Rounddown 這些函數只能用在公式媔?
Jess

TOP

回復 5# jesscc
VBA提供一些工作表函數可用.
找出可用的工作表函數 :   Application.WorksheetFunction.     ->  .  之後下可選擇
PS: VBA指令  工具->選項-> 勾選: 自動列出成員

TOP

本帖最後由 jesscc 於 2011-9-17 17:43 編輯

回復 6# GBKEE


    這一點我知道
我的疑問是如果我要四捨五入而不是取整數,用Round函數,程式不理我,那我該用什麼函數?
還有一點
  1. Range("O:O") = ""
  2. Dim yRow&
  3. yRow = [E65536].End(xlUp).Row
  4. If yRow < 7 Then Exit Sub
  5. If Range("M7:M" & yRow) = "" And Range("N7:N" & yRow) <> "" And Range("L7:L" & yRow) <> "" Then
  6. Range("O7:O" & yRow).Formula = "=Rounddown(N7*1000/L7,0)"
  7. Else
  8. Range("O7:O" & yRow).Formula = "=M7*L7"
  9. End If
  10. Range("O7:O500").Value = Range("O7:O500").Value
複製代碼
代碼中的第五行,一直出現除錯"型態不符合",And不能這樣連接嗎?
Jess

TOP

回復 7# jesscc
沒有不理你 是語法錯誤
If Range("M7:M" & yRow) = "" And Range("N7:N" & yRow) <> "" And Range("L7:L" & yRow) <> "" Then
Range("M7:M" & yRow) = ""    ->這範圍中沒資料    是嗎?      Application.CountA(Range("M7:M" & yRow)) = 0
Range("N7:N" & yRow) <> "" -> 這範圍中有資料    是嗎?       Application.CountA(Range("N7:N" & yRow)) > 0

工作表函數 :   CountA   計算不是空白的儲存格數量 , 以及引數清單中的數值
If Application.CountA(Range("M7:M" & yRow)) = 0 And Application.CountA(Range("N7:N" & yRow)) > 0 And Application.CountA(Range("L7:L" & yRow)) > 0 Then

TOP

回復  jesscc
沒有不理你 是語法錯誤
If Range("M7:M" & yRow) = "" And Range("N7:N" & yRow)  "" And  ...
GBKEE 發表於 2011-9-17 18:59



    G大,抱歉我貼錯了,應該是指同一列的資料,而不是計算所有空白儲存格
If Range("M7:M" & yRow) = "" And Range("M7:M" & yRow).Office(,1) <> "" And Range("M7:M" & yRow).Office(,-1) <> "" Then
Range("O7:O" & yRow).Formula = "=Rounddown(N7*1000/L7,0)"
Else
Range("O7:O" & yRow).Formula = "=M7*L7"
End If
像上面這樣,語法不知錯在哪裡?
Jess

TOP

回復 9# jesscc
If Range("M7:M" & yRow) = "" And Range("M7:M" & yRow).Office(,1) <> "" And Range("M7:M" & yRow).Office(,-1) <> "" Then

應該是指同一列的資料,而不是計算所有空白儲存格    :   沒看到同一列 的變數  
If Range("M"&同一列) = "" And Range("M" &同一列).Office(,1) <> "" And Range("M" &同一列).Office(,-1) <> "" Then

TOP

        靜思自在 : 一個人的快樂.不是因為他擁有得多,而是因為他計較得少。
返回列表 上一主題