Montag, Juni 1, 2020

VBA – Müssen eine Funktion erstellen, die den Bereich als Eingang

Habe ich eine zwei-dimensionale Tabelle in Excel. zB.

outputproduct      blending combination
**5                P1:0.6/P3:0.5**
  2                P1:0.3/P2:0.7
  4                P5:0.4/P2:0.7
  7                P11:0.7/P7:0.4

Angenommen, der Bereich der Tabelle variiert von B2:C6 (kann variieren). Ich habe so eine Funktion zu erstellen, deren erste Aufgabe ist das Lesen dieser Reihe( das wäre einer vom Anwender definierten Eingabe) und speichert dann die Daten in ein 2 dimensionales array, so dass ich verwenden könnte, die Daten(ganze Zahl) in die erste Spalte und die Zeichenfolge in der zweite Spalte, entsprechend.

Der ersten Spalte ist das resultierende Produkt index, während die zweite Spalte ist die Mischung der Produkte in dem angegebenen Verhältnis kombinieren zusammen, um das Produkt in der ersten Spalte.

Dann gibt es eine andere Tabelle:

product index      current stock    updated stock
      **1**             **10**
        2                 20 
      **3**             **50**
        4                 15
      **5**             **100**
        .                 .
        .                 .
        .                 .

Ich das update der Aktien Betrag in dieser Tabelle nach der Verarbeitung der Daten.
Zum Beispiel auf die Kombination von Produkt 1 mit Produkt-3 im Verhältnis von 6:5 (Einheiten), 1 Einheit von Produkt 5 produziert wird. Also, ich habe zur Aktualisierung der Anzahl von Aktien für jedes der Produkte in Tabelle 2.

Irgendwelche Vorschläge, wie konvertiert man die Reihe in einem 2 dimensionalen array?

Public Function Blending_function( R1 as Range, R2 as Range)
 ' R2 is the range of table 2, where the updating is to be done
 ' R1 is first stored in to a 2 dimensional array, such that the data in the
 ' column 1 could be read, and the data in the column 2 could be read (of table 1).
 ' the integer in the column 1 of table 1 refers to the product index in table 2.
 ' P(i) stands for the ith product. In first row of table-1, P1 and P3 combine in the 
 ' ratio of 6:5 to give P5. The current stock of each product is provide in table-2,
 ' whose range is R2(entire table 2).

 ' R1 is the range of table 1, from where the processing is to be done


End Function 

Die wichtigste Hürde für mich ist, zu konvertieren Bereich R1 (Tabelle-1) in ein 2-dimensionales array. Und dann schauen Sie aus dem array, der index des output-Produkt, und suchen Sie das Produkt in Tabelle 2 für die Aktualisierung der Lagerbestände.

Was nach Ihnen sollten die Werte von updated stock in der 2. Tabelle?
wie in „Tabelle1“, row1, die Begrenzung der agent ist P1. So aktualisiert die Werte der in Tabelle 2 ist P1 10-(10/.6), P3 50 -(10/.6) und P5 100 +(10/.6). wie gehen Sie vor ?
Ok Hab es… vielen Dank lassen Sie mich gehen Sie durch den rest der Frage 🙂
okies… gehen über die Frage,… lassen Sie mich wissen, wenn Sie irgendwelche Schwierigkeiten beim Verständnis der Frage.

InformationsquelleAutor Rachit | 2012-07-10

3 Kommentare

  1. 3

    Hier ist ein Beispiel, wie die Arbeit mit 2D-array. Die Funktion wird brechen die blending combination und extrahieren Sie die Werte, die Sie wollen, so dass Sie diese zu nutzen.

    Sub Sample()
        Dim Rng1 As Range, Rng2 As Range
    
        On Error Resume Next
        Set Rng1 = Application.InputBox("Please select the Table1 Range", Type:=8)
        On Error GoTo 0
    
        If Rng1.Columns.Count <> 2 Then
            MsgBox "Please select a range which is 2 columns wide"
            Exit Sub
        End If
    
        On Error Resume Next
        Set Rng2 = Application.InputBox("Please select the Table2 Range", Type:=8)
        On Error GoTo 0
    
        If Rng2.Columns.Count <> 3 Then
            MsgBox "Please select a range which is 3 columns wide"
            Exit Sub
        End If
    
        Blending_function Rng1, Rng2
    
    End Sub
    
    Public Function Blending_function(R1 As Range, R2 As Range)
        Dim MyAr1 As Variant, MyAr2 As Variant
        Dim i As Long
        Dim blndCom As String, OutputPrd As String
        Dim ArP1() As String, ArP2() As String, tmpAr() As String
    
        MyAr1 = R1
    
        For i = 2 To UBound(MyAr1, 1)
            OutputPrd = MyAr1(i, 1)
            blndCom = MyAr1(i, 2)
            tmpAr = Split(blndCom, "/")
    
            ArP1 = Split(tmpAr(0), ":")
            ArP2 = Split(tmpAr(1), ":")
    
            Debug.Print OutputPrd
            Debug.Print Trim(ArP1(0))
            Debug.Print ArP1(1)
            Debug.Print ArP2(0)
            Debug.Print ArP2(1)
            Debug.Print "-------"
        Next
    End Function

    SNAPSHOT

    VBA - Müssen eine Funktion erstellen, die den Bereich als Eingang

    Sobald Sie die Werte haben, die Sie verwenden können .Find für die Suche nach product index im Bereich R2 und verwenden Sie dann .Offset zu geben Sie die Formel an.

    Ich danke Ihnen sehr… dankbar für Ihre Hilfe.. ich sehe, dass Sie direkt gespeichert werden, ist die range in array MyArr1. Ist das, weil der Bereich R1 besteht aus 2 Spalten nur???? Und wenn das der Fall ist, wie kann ich speichern R2 ( 3 Spalten) in MyArr2 ..
    Is that because the range R1 consists of 2 columns only?? Keine. Das ist nicht der Grund. Speichern von 3 Spalten, die Sie verwenden können, auf die gleiche Weise 🙂 MyArr2 = R2 Aber ich sehe nicht die Notwendigkeit hier. Wie ich bereits erwähnt habe, können Sie direkt .Find zu finden, die product index in diesem Bereich. Finden Sie unter diesem link auf wie zu verwenden .Find siddharthrout.wordpress.com/2011/07/14/…
    dein blog hat mir sehr geholfen. Ich verwendet .Find zu finden, die Lage der Produkt-index in Tabelle2. Das problem ist, ich bin nicht in der Lage, ändern Sie die Werte der Spalte 3 in Tabelle 2 mit offset-Methode. Ist das, weil ich bin mit einer Funktion für die Aufgabe??Wenn das so ist, könnten Sie empfehlen mir einen besseren Weg zur Lösung??? Die syntax ist (in der Funktion) blendprodcell(j).Offset(0, 2).Value = F wo blendprodcell(j) ist die Lage des jth „blending “ Produkt“ in Tabelle 2–Spalte 1 und F ist der Wert, der aktualisiert werden in Spalte 3 Zeile j .

    InformationsquelleAutor Siddharth Rout

  2. 1

    Ich bin mir nicht sicher, ob ich Verstand die ganze Geschichte, aber das ist, was eine Funktion zurück

    ein mehrdimensionales array würde so Aussehen:

    Public Sub Main_Sub()
    
    Dim vArray_R1()                     As Variant
    Dim oRange                          As Range
    
    
    Set oRange = ThisWorkbook.Sheets(1).Range("A1:B5")
    vArray_R1 = Blending_function(oRange)
    'You do the same for The second array.     
    
    set oRange = nothing
    
    End Sub
    
    Public Function Blending_function(R1 As Range)
    
     Dim iRange_Cols As Integer
     Dim iRange_Rows As Integer
    
    
    iRange_Cols = R1.Columns.Count
    iRange_Rows = R1.Rows.Count
    
    'Set size of the array (an existing array would be cleared)
    ReDim vArray(1 To iRange_Rows, 1 To iRange_Cols)
    
    vArray = R1
    Blending_function = vArray
    
    End Function

    Eine zweite option könnte sein, um die Funktion zu deklarieren, geben einen booleschen Wert zurück, und da die Argumente sind standard gesendet byRef; Sie können erklären, die Bereiche und arrays in der main-sub nur, und konvertieren Sie Sie beide zur gleichen Zeit in der Funktion. Ich würde nicht wählen Sie diese option, weil Sie nicht in der Lage sein zu re-verwenden Sie die Funktion danach zu konvertieren, andere Bereiche in arrays.

    Ergänzende info:
    Diese Technik funktioniert in beide Richtungen. Sie können anschließend einen Bereich definieren und zu tun:

    set oRange = vArray

    Dieser unter der Bedingung, dass der Bereich hat die gleiche Größe wie das array.

    Vielen Dank für Ihre Hilfe. Ich versuchte Ihren code, aber es gibt einen Fehler zurück. Auch habe ich bearbeitet die Frage, damit könnte man es besser verstehen. Empfehlen Sie mir eine richtige Art und Weise zu gehen. Nochmals Vielen Dank
    Was ist die Fehlermeldung, die Sie erhalten? Getestet hab ich meinen eigenen code und es funktionierte…
    Was ich nicht tun will, ist schreiben Sie Ihre benutzerdefinierten code für Sie, dass ich nicht, weil ich nicht vollständig verstehen, was Sie versuchen zu erreichen. Allerdings, wenn Sie bieten eine Reihe an die Funktion, die ich geschrieben habe für Sie, haben Sie ein mehrdimensionales array zurückgegeben, mit den Werten, die den Bereich zur Verfügung gestellt. Sie können dann mit diesem array zu manipulieren, Werte in irgendeiner Weise, die Sie möchten, und konvertieren Sie es wieder in einen Bereich, wenn dies der Zweck.
    Es tut mir Leid, Es nicht wieder zurückzugeben Fehler. copy paste Fehler. Ich habe bearbeitet die Frage. Ich hoffe, es ist zu viel jetzt klar.
    Dank Kim, der Würde dir Antworten, falls ich weitere Hilfe benötigen 😉

    InformationsquelleAutor Trace

  3. 0
    row = 2
    column = "B"
    Do While Len(Range(column & row).Formula) > 0
        ' repeat until first empty cell in column 'column'(user input)
        ' read (column, row) and (column+1, row) value
         Cells(row, column).Value
         Cells(row, column+1).value
        ' store in Array
    Loop
    Vielen Dank für Ihre Mühe. Ich denke, meine Frage war nicht klar, vor. Ich bearbeitet meine Frage zum besseren Verständnis. Bitte gehen Sie durch, und lassen Sie mich wissen, ein geeigneter Weg zu gehen. Nochmals vielen Dank. 🙂
    Sie sind gefragt, für source code. Ich kann nur Anregungen geben.

    InformationsquelleAutor sreehari

Kostenlose Online-Tests