我的作業表中有 2 個選項卡,Main_Tab 和 Value_Tab。
它們看起來像這樣:
Main_Tab
| 一種 | 乙 | C | |
|---|---|---|---|
| 1 | 日 | 郵政編碼 | 價錢 |
| 2 | 莫 | 2332 | ?一種 |
| 3 | 薩 | 2332 | ?B |
| 4 | 蘇 | 2332 | ?C |
Value_Tab
| 一種 | 乙 | C | D | |
|---|---|---|---|---|
| 1 | 郵政編碼 | 月 / 日 | 薩 | 蘇 |
| 2 | 4356 | 1,10 | 1,25 | 2,08 |
| 3 | 6753 | 1,09 | 1,44 | 1,98 |
| 4 | 2332 | 1,29 | 1,76 | 2,15 |
| 5 | 8729 | 1,19 | 1,33 | 2,01 |
小提琴
現在這一天是我事先不知道的,用戶輸入日期,并從該日期開始,A 行(日行)根據輸入的日期填寫當天。
我想達到什么目標:
?A 應該顯示 Value_Tab 的 B4 單元格,因為第 4 行是郵政編碼,它是一個 Mo,所以它的第 2 列
?B 應該顯示 Value_Tab 的 C4 單元格,因為第 4 行是郵政編碼,它的一個 Sa 所以它的第 3 列
應該顯示Value_Tab 的 D4 單元格在第 4 行是郵政編碼,它是一個 Su 所以它的第 4 列
我一直在朝這個方向思考,但我在 VBA 中使用 Excel 運算式,這當然行不通,但我只想表明我在思考的方向。
Sub CheckPrice()
If Range("A2").Value == "Mo t/m Fr" Then
=VLOOKUP(A4,Tarieven!ENTIRESHEET:ENTIRESHEET,2,0)
ElseIf Range("A2").Value == "Sa" Then
=VLOOKUP(A4,Tarieven!ENTIRESHEET:ENTIRESHEET,3,0)
Else Range("A2").Value == "Su" Then
=VLOOKUP(A4,Tarieven!ENTIRESHEET:ENTIRESHEET,4,0)
End If
End Sub
我希望我發布正確并且我很清楚。
uj5u.com熱心網友回復:
我創建了一個可以完成這項作業的新宏。
Sub get_price()
Dim wb As Workbook, ws As Worksheet, data_ws As Worksheet
Dim cur_row As Integer, max_row As Integer, data_column_index As Integer
Set wb = ActiveWorkbook
Set ws = wb.Sheets("Main_Tab")
Set data_ws = wb.Sheets("Value_Tab")
max_row = ws.Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).Row
With ws
For cur_row = 2 To max_row
Select Case .Cells(cur_row, 1).Value
Case "Mo", "Tu", "We", "Th", "Fi"
data_column_index = 2
Case "Sa"
data_column_index = 3
Case "Su"
data_column_index = 4
End Select
.Cells(cur_row, 3).Formula = "=index(" & data_ws.Name & "!" & (Columns(data_column_index).Address) & ",match(" & .Cells(cur_row, 2).Address & "," & data_ws.Name & "!$A:$A,0))"
Next
End With
End Sub
我將公式注入目標單元格只是因為您插入了 Vlookup 公式;否則,我會在 VBA 中進行查找并獲取值。為此,您可以替換該行
.Cells(cur_row, 3).Formula = "=index(" & data_ws.Name & "!" & (Columns(data_column_index).Address) & ",match(" & .Cells(cur_row, 2).Address & "," & data_ws.Name & "!$A:$A,0))"
和
With Application.WorksheetFunction
ws.Cells(cur_row, 3) = .Index(data_ws.Columns(data_column_index), .Match(ws.Cells(cur_row, 2), data_ws.Columns(1), 0))
End With
這將在價格列中輸入值而不是公式。
另外,為了跟進我的問題,如果您愿意將 Mo 到 Fr 列傳播,我已經整理了一個示例檔案,以便您可以查看結果。Excel 示例檔案包含 4 個選項卡。使用 index() 和 match() 函式的組合,VBA 解決方案的 2 個選項卡和 Mo 到 Fr 展開的公式解決方案的 2 個選項卡。
index() 函式的作業原理是接收查找陣列、行索引和列索引;就像地圖上的協調。
match() 函式是一個非常高效的查找公式,可以水平和垂直匹配。最好的部分是,無需對源陣列上的資料進行排序。
結合這兩個函式可以從資料表中得到你想要的東西,比vlookup() 和hlookup() 更高效。
另一種方法是使用 sumproduct() 公式。
我在示例檔案中包含了所有這些,可以幫助您理解每種方法。無論如何,您的最后選擇將是 vlookup 和 hlookup,因為一旦您的作業表充滿了大量查找,它們就會占用大量 CPU。
示例 Excel 檔案
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/341096.html
上一篇:如何根據行值對列進行動態排序
