Actualmente estoy trabajando en excel vba, aunque mi programación es simplemente terrible. Me gustaría realizar la siguiente funcionalidad. Tengo 2 rangos de datos:
Un rango (a1:a10) se refiere a la variable que debe verificarse con el otro rango (b1: b250). La condición contra la cual se está verificando la variable debería ser que si la variable es más pequeña (<) que los valores en el rango (b1: b250), debería escupir la variable, de lo contrario debe mostrar "0".
Por lo tanto, a = 1 a 10 debe verificar contra todoslos valores de b = 1 a 250 como si el bucle se ejecutara 2500 veces para garantizar que todos los valores en el rango (a1: a10) hayan sido comparados con el rango (b1: b250). Por favor, avíseme si puede ayudar o qué otra información es necesaria.
Respuestas
2 para la respuesta № 1Puedes hacerlo sin ningún tipo de bucles. Una consulta SQL funciona para usted. Aquí es cómo puedes hacer eso.
Sub tadaaa()
Dim con As Object, rs As Object
Dim query As String, query1 As String
Dim connector As String
Dim address As String
Dim sht As Worksheet
Set sht = Sheets("Sheet1")
Set con = CreateObject("adodb.connection")
Set rs = CreateObject("adodb.recordset")
address = ThisWorkbook.FullName
connector = "provider=microsoft.ace.oledb.12.0;data source=" & _
address & ";extended properties=""Excel 12.0 Macro;hdr=yes"""
con.Open connector
query = "select Defender from [sheet1$] where Defender < "
"Source sheet
For i = 2 To sht.Range("b" & Rows.Count).End(xlUp).Row
query1 = query & sht.Cells(i, 2).Value
Set rs = con.Execute(query1) "Execute the query
"Recording query results to any sheet you want.
sht.Cells(6500, 2 * i).End(3).Offset(1, 0).CopyFromRecordset rs
sht.Cells(1, 2 * i).Value = rs.Fields(0).Name & " vs A" & i
Set rs = Nothing
query1 = Empty
Next
Set con = Nothing
End Sub
Es mi hoja inicial. Sus valores B están en la columna A y los valores A están en la columna B.
Y este es el código vba posterior.
1 para la respuesta № 2
¡Gracias a Ali SM por mostrar una manera excelente, pero menos conocida! Antes de Ali, hubiera sugerido un enfoque más de Loop-Less más:
Sub WithoutLoop()
Range("E1").FormulaR1C1 = "=""Vs Examiner ""&OFFSET(R2C2,COLUMN()-5,0)"
Range("E2").FormulaR1C1 = "=IF(OFFSET(R2C2,COLUMN()-5,0)<RC4,OFFSET(R2C2,COLUMN()-5,0),0)"
Range("E1").Copy
Range("E1", Range("E1").Offset(0, 9)).PasteSpecial xlPasteFormulas
Range("E2").Copy
Range("E2", Range("E2").Offset(2500, 9)).PasteSpecial xlPasteFormulas
End Sub
Antes de Macro:
Después de Macro: