title: Only public user defined types defined in public object modules can be used as parameters in VBA
body: <p>I have a public UDT, and wanted to use it as parameter in a Public Sub in a normal Module. I then get a compile error:</p>
  
  <blockquote>
    <p>Only public user defined types defined in public object modules can be used as parameters or return type for public procedures of class modules or as fields of public user defined types.</p>
  </blockquote>
  
  <p>I don't know really understand it, the UDT and sub are public.</p>
  
  <p>Here is the UDT I defined.</p>
  
  <pre><code>Public Type perf
      retailer As String
      sale As Integer
      cateDiscrip As String
      prodCode As String
      forecast As Integer
      score As Double
  End Type
  </code></pre>
  
  <p>Basically, I wanted to store a table(with retailer,category description, product code etc.) into an array and then sorted them by retailer, for the same retailer, sorted by category. 
  I copied them from another sheet and then pasted them into the current workbook "data" sheet.
  Then, I defined a public UDT and stored them in an array. </p>
  
  <pre><code>Public Sub getlist()
  
      Dim highvol() As perf
      Dim lowvol() As perf
      Dim oneArr() As perf
      Dim i As Integer
      Dim s As Integer
  
      Set ws = Application.Worksheets("data")
  
      'find the number of retailers, redimension the array, and fill them with
      'the data in the lists
  
      With ws.Range("A2")
          nRetailer = ws.Range(.Offset(1, 0), .End(xlDown)).Rows.Count
          ReDim highvol(nRetailer)
      End With
  
      For isale = 2 To nRetailer
            If ws.Range("M1").Cells(isale) &gt;= 10 Then
                n = n + 1
            Else
                m = m + 1
            End If
       Next
  
      ReDim highvol(n)
      ReDim lowvol(m)
      ReDim oneArr(nRetailer)
  
      nsale = 0
      msale = 0
  
  ''isale is the current row, nsale is the size of highvol sales. 
      For isale = 2 To nRetailer
          If ws.Range("M1").Cells(isale) &gt;= 10 Then
              nsale = nsale + 1
              highvol(nsale).sale = ws.Cells(isale, 13)
              highvol(nsale).forecast = Str(ws.Range("N1").Cells(isale))
              highvol(nsale).retailer = ws.Range("A1").Cells(isale)
              highvol(nsale).cateDiscrip = ws.Range("B1").Cells(isale)
              highvol(nsale).prodCode = ws.Range("C1").Cells(isale)
              highvol(nsale).score = Str((1 - AbsPerErr(ws.Range("M1").Cells(isale), ws.Range("N1").Cells(isale))) * 100)
          Else
              msale = msale + 1
              lowvol(msale).sale = Str(ws.Range("M1").Cells(isale))
              lowvol(msale).forecast = Str(ws.Range("N1").Cells(isale))
              lowvol(msale).retailer = ws.Range("A1").Cells(isale)
              lowvol(msale).cateDiscrip = ws.Range("B1").Cells(isale)
              lowvol(msale).prodCode = ws.Range("C1").Cells(isale)
              lowvol(msale).score = Str((1 - AbsPerErr(ws.Range("M1").Cells(isale), ws.Range("N1").Cells(isale))) * 100)
          End If
      Next
  </code></pre>
  
  <p>After that, I had two functions for filter and compare, passed the data into one array. </p>
  
  <pre><code>    For i = 1 To nsale
          oneArr(i) = highvol(i)
      Next
  
      For s = 1 To msale
          oneArr(nsale + s) = lowvol(s)
      Next
  
      Dim result1() As perf
      Dim result2() As perf
  
      filter oneArr, "AED", 1, result1
      filter result1, "RhinoBulk1", 2, result2
  
  End Sub
  </code></pre>
  
  <p>This is where I get the error <strong><em>filter oneArr</em></strong>. Can anyone explain what's going wrong and how to fix it?</p>