Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

271
Views
Intentando traducir un procedimiento simple a VBA en Excel

tengo dos hojas Sheet1 es una tabla XML importada, por lo que parece un poco incómoda, como un peldaño de tablas. Sheet2 es una sola columna que es una lista de cadenas. Sheet1 tiene varios miles de filas. Sheet2 tiene unos pocos cientos de entradas.

Quiero encontrar cada instancia de cada cadena exacta en Sheet2 dentro de Sheet1, luego elimine toda la fila en Sheet1. Ese es el procedimiento.

En mi cabeza esto es simple, y si tuviera horas podría hacerlo manualmente pero sería una tediosa pérdida de tiempo ya que debería estar automatizado.

He estado tratando de encontrar recursos sobre cómo hacer esto, pero me resulta muy difícil obtener información que me permita escribir un procedimiento general. Tanto las fuentes de datos de la Hoja 1 como la de la Hoja 2 crecerán y cambiarán con el tiempo, por lo que quiero hacer una solución general ahora.

Tengo una secuencia de comandos de Python que se supone que debe recortar la fuente XML usando lo que sería el contenido de Sheet2, pero el XML resultante está roto y es inaceptable, ya que termina faltando tipos de datos. No sé si hacer esto a través de Excel preservará los tipos de datos, pero por eso lo intento. Aprendí C en la universidad (ingeniería eléctrica) pero nunca Python o VBA.

Suponiendo que las hojas son como matrices indexadas por [filas, columnas]. Esto es lo que estoy tratando de hacer, con las funciones reemplazando lo que sea necesario en VBA para lograr el mismo objetivo.

 String str; Int r, foundStrRow; */rowFind(sheet, string) being a function that finds arg string within sheet and returns the row index Delete(sheet, row) being a function that deletes the index row from sheet*/ While(Sheet2[r,1]) { Str = Sheet2[r, 1]; foundStrRow = rowFind(Sheet1,Str); Delete(Sheet1, foundStrRow); r++ }

Desafortunadamente, los datos en sí no son algo que se pueda compartir por razones de seguridad, pero puedo proporcionar un conjunto falso de datos aquí.

https://imgur.com/a/9Ekvoi3

Imagine que Sheet1 tiene ese escalón que tiene aproximadamente 20000 filas y 200 columnas. Sheet2 tiene 400 filas y una columna.

Esto es lo que se me ocurrió. Es capaz de encontrar y eliminar una fila completa si la cadena de Sheet2 existe en Sheet1, pero ahora tengo que descubrir cómo condicionarla a la cadena existente. No estoy seguro de cómo hacerlo todavía, pero si la cadena de la Hoja2 no está en la Hoja1, entonces debo pasar a la siguiente entrada.

 Sub Trimmer() Dim Rows2 as Integer Dim wordToSearch as String 'Sets Rows2 to be limit of the loop With Sheet2 With .Cells.SpecialCells(xlCellTypeLastCell) Rows2 = .Row End With End With For r2=1 to Rows2 Sheets("Sheet2").Select wordToSearch = Cells(r2,1).Value Sheets("Sheet1").Select Cells.Find(What := wordToSearch, After := ActiveCell, LookIn := xlFormulas2, _ LookAt :=xlWhole, SearchOrder := xlByRows, SearchDirection:= xlNext, _ MatchCase := False, SearchFormat := False).Activate Rows(ActiveCell.Row).Select Application.CutCopyMode = False Selection.Delete Shift:=xlUp

Esto iterará y eliminará las filas completas como quiero donde existe la coincidencia con la lista en la Hoja2, pero solo necesito que se salte cuando algo en la lista de la Hoja2 no se encuentra en la Hoja1.

about 4 years ago · Santiago Trujillo
1 answers
Answer question

0

Lo que haría es crear dos matrices para contener las hojas 1 y 2. Luego, haga un bucle en la matriz 2, haga un bucle interno para la matriz 1 y busque coincidencias.

 Sub MatchLinesFromSheets() Dim ArrSheet1(), ArrSheet2() Dim Rows1 As Long, r1 As Long, Cols1 As Long, c1 As Long Dim Rows2 As Long, r2 As Long Dim PasteRow As Long 'Load Sheet1 into array With Sheet1 With .Cells.SpecialCells(xlCellTypeLastCell) Rows1 = .Row Cols1 = .Column End With ArrSheet1 = .Range(.Cells(1, 1), .Cells(Rows1, Cols1 + 1)).Value End With 'Load Sheet2 into array With Sheet2 With .Cells.SpecialCells(xlCellTypeLastCell) Rows2 = .Row End With ArrSheet2 = .Range(.Cells(1, 1), .Cells(Rows2, 1)).Value End With 'Step through each row of Sheet2 For r2 = 1 To Rows2 'Step through each row and column of Sheet1 For r1 = 1 To Rows1 For c1 = 1 To Cols1 If ArrSheet2(r2, 1) = ArrSheet1(r1, c1) Then ArrSheet1(r1, c1) = "" ArrSheet1(r1, Cols1 + 1) = "x" Exit For End If Next Next Next 'Remove blank rows For r1 = 1 To Rows1 If ArrSheet1(r1, Cols1 + 1) <> "x" Then PasteRow = PasteRow + 1 For c1 = 1 To Cols1 ArrSheet1(PasteRow, c1) = ArrSheet1(r1, c1) ArrSheet1(r1, c1) = "" Next End If Next With Sheets.Add .Range(.Cells(1, 1), .Cells(Rows1, Cols1)) = ArrSheet1 End With End Sub
about 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!