arrays - vettore - valore assoluto in matlab




Eliminazione di elementi in una matrice se l'elemento è un determinato valore VBA (5)

Quando crei l'array, perché non saltare gli 0 e risparmiarti il ​​tempo di dovertene preoccupare in seguito? Come accennato in precedenza, gli array non sono adatti per la cancellazione.

Ho un array globale, prLst() che può essere di lunghezza variabile. Prende numeri come stringhe da "1" a Ubound(prLst) . Tuttavia, quando l'utente inserisce "0" , voglio eliminare quell'elemento dall'elenco. Ho scritto il seguente codice per eseguire questo:

count2 = 0
eachHdr = 1
totHead = UBound(prLst)

Do
    If prLst(eachHdr) = "0" Then
        prLst(eachHdr).Delete
        count2 = count2 + 1
    End If
    keepTrack = totHead - count2
    'MsgBox "prLst = " & prLst(eachHdr)
    eachHdr = eachHdr + 1
Loop Until eachHdr > keepTrack

Questo non funziona. Come faccio a eliminare in modo efficiente gli elementi nell'array prLst se l'elemento è "0" ?

NOTA: Questo fa parte di un programma più grande, per il quale è possibile trovare la descrizione di questo: Ordinamento di gruppi di righe VBA Macro di Excel


Sono abbastanza nuovo per vba ed excel - l'ho fatto solo per circa 3 mesi - ho pensato di condividere il mio metodo di deduplicazione dell'array qui perché questo post sembra pertinente ad esso:

Questo codice se parte di un'applicazione più grande che analizza i dati del tubo: i tubi sono elencati in un foglio con il numero in formato xxxx.1, xxxx.2, yyyy.1, yyyy.2 ..... ecco perché esiste tutta la manipolazione delle stringhe. fondamentalmente raccoglie solo il numero del tubo una volta sola, e non la parte .2 o .1.

        With wbPreviousSummary.Sheets(1)
'   here, we will write the edited pipe numbers to a collection - then pass the collection to an array
        Dim PipeDict As New Dictionary

        Dim TempArray As Variant

        TempArray = .Range(.Cells(3, 2), .Cells(3, 2).End(xlDown)).Value

        For ele = LBound(TempArray, 1) To UBound(TempArray, 1)

            If Not PipeDict.Exists(Left(TempArray(ele, 1), Len(TempArray(ele, 1) - 2))) Then

                PipeDict.Add Key:=Left(TempArray(ele, 1), Len(TempArray(ele, 1) - 2)), _
                                                        Item:=Left(TempArray(ele, 1), Len(TempArray(ele, 1) - 2))

            End If

        Next ele

        TempArray = PipeDict.Items

        For ele = LBound(TempArray) To UBound(TempArray)
            MsgBox TempArray(ele)
        Next ele

    End With
    wbPreviousSummary.Close SaveChanges:=False

    Set wbPreviousSummary = Nothing 'done early so we dont have the information loaded in memory

Usando un mucchio di finestre di messaggi per il debug di sicurezza, sono sicuro che lo cambierai per adattarlo al tuo lavoro.

Spero che le persone lo trovino utile, saluta Joe


Eliminazione di elementi in una matrice se l'elemento è un determinato valore VBA

per eliminare elementi in una matrice con determinate condizioni, puoi codificare in questo modo

For i = LBound(ArrValue, 2) To UBound(ArrValue, 2)
    If [Certain condition] Then
        ArrValue(1, i) = "-----------------------"
    End If
Next i

StrTransfer = Replace(Replace(Replace(join(Application.Index(ArrValue(), 1, 0), ","), ",-----------------------,", ",", , , vbBinaryCompare), "-----------------------,", "", , , vbBinaryCompare), ",-----------------------", "", , , vbBinaryCompare)
ResultArray = join( Strtransfer, ",")

Io spesso manipolo 1D-Array con Join / Split ma se devi cancellare un certo valore in Multi Dimension ti suggerisco di cambiare quelle Array in 1D-Array come questa

strTransfer = Replace(Replace(Replace(Replace(Names.Add("A", MultiDimensionArray), Chr(34), ""), "={", ""), "}", ""), ";", ",")
'somecode to edit Array like 1st code on top of this comment
'then loop through this strTransfer to get right value in right dimension
'with split function.

Un array è una struttura con una certa dimensione. È possibile utilizzare gli array dinamici in VBA che è possibile ridurre o aumentare utilizzando ReDim ma non è possibile rimuovere gli elementi nel mezzo. Non è chiaro dal tuo esempio come funziona il tuo array funzionalmente o come determini la posizione dell'indice (eachHdr) ma fondamentalmente hai 3 opzioni

(A) Scrivi una funzione personalizzata 'cancella' per il tuo array come (non testata)

Public Sub DeleteElementAt(Byval index As Integer, Byref prLst as Variant)
       Dim i As Integer

        ' Move all element back one position
        For i = index + 1 To UBound(prLst)
            prLst(i - 1) = prLst(i)
        Next

        ' Shrink the array by one, removing the last one
        ReDim Preserve prLst(Len(prLst) - 1)
End Sub

(B) Basta semplicemente impostare un valore 'fittizio' come valore invece di eliminare effettivamente l'elemento

If prLst(eachHdr) = "0" Then        
   prLst(eachHdr) = "n/a"
End If

(C) Interrompere l'utilizzo di un array e modificarlo in un VBA.Collection. Una collezione è una (unica) struttura di coppie chiave / valore in cui è possibile aggiungere o eliminare liberamente elementi

Dim prLst As New Collection

So che questo è vecchio, ma ecco la soluzione che ho trovato quando non mi piacevano quelli che ho trovato.

-Loop attraverso l'array (Variant) aggiungendo ogni elemento e qualche divisore a una stringa, a meno che non corrisponda a quello che si desidera rimuovere -Quindi dividere la stringa sul divisore

tmpString=""
For Each arrElem in GlobalArray
   If CStr(arrElem) = "removeThis" Then
      GoTo SkipElem
   Else
      tmpString =tmpString & ":-:" & CStr(arrElem)
   End If
SkipElem:
Next
GlobalArray = Split(tmpString, ":-:")

Ovviamente l'uso di stringhe crea alcune limitazioni, come la necessità di essere sicuri delle informazioni già presenti nell'array, e come-questo codice rende il primo elemento dell'array vuoto, ma fa quello che mi serve e con un po 'più di lavoro potrebbe essere più versatile.





element