簡體   English   中英

解決這種復雜情況需要 Excel 公式或 VBA

[英]Excel formula or VBA required to resolve this case complicated

親愛的團隊,您能幫我解決以下問題嗎

在 excel 文件中,我們有可用資源的名稱和部門

第一個表我們有詳細信息,第二個表需要填寫數字或只是評論是或否。

我已經嘗試過使用 IF 公式,它不會有幫助,因為單元格會根據每天變化的第二張表繼續移動

我試過沒有用的公式

If(A2&b1=a12&b11,if(b2<0,"No","Yes"),"Match not found")

請你幫助我好嗎。 VBA 是新手,不知道這個案例有什么幫助

在此處輸入圖像描述

您可能希望將第一個表從跨表布局轉換為表格(又名 unpivot):

例如,第一列=名稱,第二列=部門,然后將第三列添加為組合:“名稱/部門”(或兩者之間的任何其他分隔符)

| a1 | 1011 | a1/1011 | 1 |

| a1 | 1033 | a1/1033 | 3 |

等等

在第二個交叉表中,您可以使用 vlookup/xlookup:

匹配條件是左側名稱和列標題上的部門的相應組合(例如 A12&”/“&”B11)

將其與第一個表(在表格布局中)的第 3 列匹配(vlookup)以取回值(或“是”) - 這應該根據相應列和行標題中的值動態工作(而不依賴於位置)細胞)

使用 PowerQuery 取消透視並添加第三列並將數字替換為“是”以創建第一個表格的表格版本

我問了一個澄清問題,但你沒有興趣回答。

無論如何,我使用數組和字典准備了一個足夠快的答案。 它使用您在圖片中向我們展示的范圍。 我想將其配置為使用兩張紙並自動計算每張紙的最后一行。

它假定在​​第一個表中有唯一的名稱。 在第二個中,可以按任何排序順序包含任意數量的名稱。

請測試下一個代碼並發送一些反饋:

Sub matchNames()
  Dim sh As Worksheet, lastR As Long, dict As Object
  Dim rngGlob As Range, rngRow As Range, arrGlob, arrSrc, i As Long, j As Long, arrYes, arrRet
  
  Set sh = ActiveSheet
  lastR = 7 ' if can be calculated, if two sheets will be used: sh.Range("A" & sh.rows.count).End(xlUp).row
  Set rngGlob = sh.Range("A1:G" & lastR): arrGlob = rngGlob.Value2
  
  arrSrc = sh.Range("B11:D11").Value2 'the array of numbers to be matched in the global array
  arrRet = sh.Range("A12:D17").Value2 'the array of the range to return (Yes...)
  
  
  'place the "Yes" string where the numbers exist in an array and load the dictinary:
  Set dict = CreateObject("Scripting.Dictionary")
  For i = 2 To UBound(arrGlob)
     On Error Resume Next 'for the case of no any value on the processed row:
        Set rngRow = rngGlob.rows(i).Offset(0, 1).Resize(1, rngGlob.Columns.count - 1).SpecialCells(xlCellTypeConstants)
     On Error GoTo 0
     If Not rngRow Is Nothing Then arrYes = getYes(rngGlob, rngRow, arrSrc)
        
     dict(arrGlob(i, 1)) = IIf(IsArray(arrYes), arrYes, vbNullString)  'place the array containing Yes as Item
     Erase arrYes
  Next i
  'place the dictionary arrays value in the array to be returned:
  For i = 1 To UBound(arrRet)
       arrYes = dict(arrRet(i, 1))
       If UBound(arrYes) = UBound(arrSrc, 2) - 1 Then
             For j = 0 To UBound(arrYes)
                  arrRet(i, j + 2) = arrYes(j)
            Next j
        Else
            'place empty strings, to clean eventually older values whchid does not correspond, anymore
            For j = 0 To UBound(arrSrc, 2) - 1: arrRet(i, j + 2) = "": Next j
        End If
  Next i
 
  sh.Range("A12").Resize(UBound(arrRet), UBound(arrRet, 2)).Value2 = arrRet
End Sub

Function getYes(rngGlob As Range, rng As Range, arr) As Variant 'it returns the "Yes" array per name
     Dim rngH As Range, arrY, i As Long, cel As Range, mtch
     ReDim arrY(UBound(arr, 2) - 1)
     Set rngH = rng.Offset(-(rng.row - 1))
     For Each cel In rngH.cells
        mtch = Application.match(cel.value, arr, 0)
        If IsNumeric(mtch) Then
            arrY(mtch - 1) = "Yes"
        End If
     Next cel
    
     getYes = arrY
End Function

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM