Saltar al contenido

Israel Cassales

Miembro
  • Contador de contenido

    1366
  • Unido

  • Última visita

  • Días con premio

    69
  • País

    México

Todo se publica por Israel Cassales

  1. ¡Vaya! Un poco tarde para comentar, seguro ya está resuelto. Una idea sería usar algo parecido a ShellWait pero como en VBA no tiene un comando así, se puede imitar con una función a modo que espere a que el proceso termine. Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As LongPtr, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As LongPtr Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) Sub ImprimirMC() Dim sfile As String Dim uf As Long Dim j As Long Set a = Sheets(ActiveSheet.Name) uf = a.Range("B" & Rows.Count).End(xlUp).Row For j = 3 To uf If a.Range("D" & j).Value = "" Then sfile = a.Cells(j, "B").Value ShellExecute 0&, "print", sfile, vbNullString, vbNullString, 0 ' Agregar un retraso para permitir que la impresora procese el archivo Sleep 2000 ' 2000 ms = 2 segundos (ajustable según tu impresora) End If Next j End Sub El Sleep 2000: Espera de 2 segundos entre cada impresión. lo puedes ajustar a la velocidad de tu impresora según el tamaño de los archivos. El ShellExecute mantendrá la instrucción original para enviar el archivo directamente a imprimir. Ahora, para no abrir los archivos se usa el ShellExecute en modo "print" eso debería evitar la apertura del libro, pero OJO depende de la configuración del programa predeterminado en tu sistema. Si los sigue haciendo, debes revisar las asociaciones predeterminadas de Windows para cada tipo de archivo. Saludines
  2. Tengo duda si la última fórmula podría llegar a devolver alguna referencia circular, así que deberás de hacer pruebas o subir un libro con el ejemplo de los datos y del resultado buscado.
  3. Bueno, me parece que el consultante no es claro, me complica recomendar alguna FUNCION. Antes que otra cosa ¿Cómo son los datos 2mm, 13mm? Es decir, son valores con formato personalizado al "mm" o son textos completos "2mm", "13mm". Además dices: En ese rango de 30 filas podrían haber varias secciones con días consecutivos, ¿cuál importa, el mayor de esos rangos? Por esas incógnitas podré aportar sólo siguiente: Separar las "mm" de los textos =VALOR(SUSTITUIR(C1,"mm","")) Define cuales cumplen con el criterio mayor que 11: =SI(D1>=11, 1, 0) Encuentra los consecutivos mayores a 11: =SI(E2=1, SI(FILA(E2)=1, 1, F2+1), 0) Y si requieres encontrar el mayor de ellos: =MAX(F1:F30) Saludines
  4. Comprobar Diario (C).xlsx
  5. Bueno, Solo por por diversión porque el tema está resuelto agregaré algo adicional para futuros lectores. Antes me permito saludar al Maestro @Victor7 ya que es un gusto coincidir con usted en un tema, mencionar además que sus soluciones siempre me sorprenden, aprendo bastante. Ahora, suponiendo que @jcameroe ordena los datos para que previamente queden juntos ¿qué pasa si no se hace esto? El condicional es probable que no lo detecte: Así que algo distinto sería validar todo el rango en el condicional: =SUMAPRODUCTO(($B$5:$B$26=$B5)*($E$5:$E$26=$E5)*($J$5:$J$26=$J5)*($K$5:$K$26=$K5)*(FILA($B$5:$B$26)<>FILA($B5))) > 0 Lo que hace es: $B$5:$B$26=$B5: Compara cada celda en la columna B del rango seleccionado con el valor de la columna B en la fila actual. Devuelve VERDADERO si coinciden y FALSO si no. $E$5:$E$26=$E5: Hace lo mismo para la columna E. $J$5:$J$26=$J5: Hace lo mismo para la columna J. $K$5:$K$26=$K5: Hace lo mismo para la columna K. FILA($B$5:$B$26)<>FILA($B5): Asegura que la comparación no se haga con la misma fila. Devuelve VERDADERO si las filas son diferentes y FALSO si son iguales. Multiplicando estos cinco componentes da como resultado 1 solo si todas las condiciones son VERDADERO SUMAPRODUCTO: Suma todos los resultados de las multiplicaciones. Si hay alguna fila que cumple todas las condiciones, la suma será mayor que 0. > 0: Esta comparación devuelve VERDADERO si hay al menos una coincidencia en el rango especificado. Así no importara si se ordena o no los datos antes de usar el condicional: Mis mejores deseos para todos. Saludines
  6. La recomendación del maestro es importante, se evitan ambigüedades o deducciones. De momento te dejo el libro con el ejemplo de la condicional anterior. COMPROBAR DIARIO.xlsx
  7. En base a lo explicado Si el "asiento" es el responsable de indicar cuál será el duplicado a buscar, algo así en el formato condicional debería servir: =CONTAR.SI($E$5:$E$26, $E5) > 1 Saludines
  8. Me da gusto que le haya servido, concluyo mi participación.
  9. Sub BuscarYListarHojas() Dim ruta As String Dim nombreLibro As String Dim libro As Workbook Dim hojaDestino As Worksheet Dim i As Integer Dim fd As FileDialog Dim rutaCompleta As String Set fd = Application.FileDialog(msoFileDialogFilePicker) fd.Title = "Seleccionar archivo" fd.Filters.Add "Archivos de Excel", "*.xls; *.xlsx; *.xlsm", 1 fd.AllowMultiSelect = False If fd.Show = -1 Then rutaCompleta = fd.SelectedItems(1) Else MsgBox "No se seleccionó ningún archivo.", vbExclamation Exit Sub End If On Error GoTo ErrorHandler Set libro = Workbooks.Open(rutaCompleta) On Error GoTo 0 Set hojaDestino = ThisWorkbook.Sheets("lista") hojaDestino.Cells.Clear For i = 1 To libro.Sheets.Count hojaDestino.Cells(i, 1).Value = libro.Sheets(i).Name Next i libro.Close False MsgBox "Hojas listadas exitosamente en la hoja 'lista'", vbInformation Exit Sub ErrorHandler: MsgBox "No se pudo abrir el libro especificado. Verifique el nombre y la ruta.", vbCritical End Sub Recuerde, para ejecutar debe extraer del ZIP AYUDA EXCEL.zip
  10. Hola, Lo importante para lograr eso es la ruta donde se encuentre el libro que va a buscar, es decir; esa ruta debe existir en la sentencia. Como no la trae tu libro de ejemplo te podré ayudar con algo parecido. La sentencia que te comparto no buscará directamente el libro de la celda D2 sino que abrirá el explorador de archivos, manualmente debe seleccionar el libro y posteriormente listará las hojas. Para tomar el nombre de su hoja BASIC ya solo debe modificar un poco. Saludos cordiales.
  11. Saludos cordiales, Le recomiendo volver a plantear su consulta y si lo que busca son ideas en VBA publiquelo en la sección del foro correspondiente a VBA.
  12. Hola, No me lo tome a mal pero más que ayuda parece una solicitud de servicio, creo si contacta con algún administrador éste le puede dar recomendaciones de cómo obtener soluciones personalizadas o esperar si (tal vez) alguno de los maestros o miembros avanzados del foro le puede aportar algo. Si un poco de ayuda o recomendación le viene bien, le sugiero: Haga una copia de su libro, hay ocasiones que prefieren subir el original para no editarlo. Inténtelo, para lo que menciona no necesita todos esos datos que lo hacen pesado. Guárdelo como tipo binario, los códigos no le afectan. Seccione su consulta, describa lo que ha hecho para lograr el resultado y en dónde le mostró errores en caso de presentarlos. Que tenga un buen día, saludos cordiales.
  13. Saludos cordiales, como ya ha mencionado el maestro, la función FILTRAR() debería resolver la necesidad planteada poniendo como criterio <>0, o eliminar manualmente los 0 del rango en la función (si no son muchos)
  14. Hola! No te preocupes, si mandas un libro con el ejemplo tu explicación quedaría más clara. Te escribo lo que entiendo, ¿quieres actualizar los importes en la hoja “BBDD” basándote en los datos de la hoja “USUARIO” cuando los números de factura coincidan? Además, ¿quieres limpiar las filas en la hoja “USUARIO” después de la actualización? Como las deducciones no son buenas consejeras lo único que aportare a tu tema sera modificar tu código en base a eso. Sub CORREGIRIMPORTES2() Dim i As Long, j As Long Dim lastRowBBDD As Long, lastRowUSUARIO As Long ' Encuentra la última fila con datos en ambas hojas lastRowBBDD = Sheets("BBDD").Cells(Sheets("BBDD").Rows.Count, "J").End(xlUp).Row lastRowUSUARIO = Sheets("USUARIO").Cells(Sheets("USUARIO").Rows.Count, "J").End(xlUp).Row j = 3 ' DONDE EMPIEZA A ESCRIBIR For i = 3 To lastRowBBDD ' DONDE EMPIEZA A BUSCAR If Sheets("BBDD").Range("J" & i).Value = Sheets("USUARIO").Range("J" & j).Value Then Sheets("BBDD").Range("K" & i).Value = Sheets("USUARIO").Range("K" & j).Value j = j + 1 End If Next i ' Limpia las filas en la hoja USUARIO después de la actualización For j = 3 To lastRowUSUARIO If Sheets("USUARIO").Range("A" & j).Value <> "" Then Sheets("USUARIO").Range("A" & j & ":Q" & j).ClearContents End If Next j End Sub Que hice: 1 Encontrar la última fila con datos, eso asegura que el código no procese filas vacías innecesariamente. 2 Uso de Sheets para especificar la hoja, así haces que el código sea más claro. 3 Limpiar la filas, utiliza ClearContents para limpiar todas las celdas de la fila de una sola vez. Si no es así, trata de mejorar la consulta así podrías recibir mejor ayuda.
  15. Entiendo, siendo así concluyo mi participación en la consulta. ¡Saludos Totales!
  16. Hola, En base a lo explicado (no entendí que hay en B22, así que use C5 como lo tienes) una forma de editar tu fórmula sería así: =(((365-(104+SUMAPRODUCTO((DIASEM(D5:D25,2)<6)*1)))*8)/365)*DIA(FIN.MES(HOY(),0))*C5 Recuerda cambiar la coma por punto y coma.
  17. Hola, buen día. Eso no es exacto, si escribe la palabra casa, le muestra ambas celdas que contienen la palabra casa. Tal como se muestra en el ejemplo: Para sus otras dos consultas le recomiendo abrir un tema por cada una, el motivo es porque el tema se empieza a extender a escenarios que no son inherentes al tema original. Es posible que también pueda ayudarle o reciba apoyo de algún maestro adicional, incluso aún es posible que algún maestro participe en este mismo en esas consultas adicionales. Tome en cuenta por favor que se brinda ayuda, no soluciones personalizadas.
  18. Podría ser por la forma en la que se limpia el combobox, deja hacer unos cambios en el código. Pues creo que podría ayudarte si queda así
  19. Hola, Algo como esto debería servir de acuerdo la explicación: Private Sub ComboBox1_Change() Dim rng As Range Dim cell As Range Dim searchText As String Dim results As Collection Dim item As Variant Set rng = Me.Range("A1:A4") searchText = ComboBox1.Text Set results = New Collection For Each cell In rng If InStr(1, cell.Value, searchText, vbTextCompare) > 0 Then results.Add cell.Value End If Next cell ComboBox1.Clear For Each item In results ComboBox1.AddItem item Next item End Sub Private Sub Worksheet_Activate() ComboBox1.Clear End Sub
  20. Me da gusto que le haya servido, concluyo mi participación en la consulta.
  21. Hola, Pues el código que ha compartido (en mi opinión) se ve bien en su estructura, tal vez el problema de que se borre el ítem se deba a la forma en que se está limpiando el ComboBox. Por qué no guarda el ítem seleccionando una variable selectedItem. Así después de limpiar y volver a llenar el ComboBox, restaura el ítem seleccionado. Algo así: Private Sub Combobox1_DropButtonClick() Dim sd As New Collection Dim celda As Range Dim dato Dim r As Range Dim UF As Integer Dim selectedItem As String On Error Resume Next Worksheets("CONSOLIDADO").Activate Range("S2").Select ' Guarda el ítem seleccionado selectedItem = Combobox1.Value ' Limpia el ComboBox Combobox1.Clear With Worksheets("BASE") UF = .Range("S" & Rows.Count).End(xlUp).Row Set r = .Range("S2:S" & UF) For Each celda In r sd.Add celda.Value, CStr(celda.Value) Next celda For Each dato In sd Combobox1.AddItem dato Next dato End With ' Restaura el ítem seleccionado Combobox1.Value = selectedItem End Sub
  22. Días Consecutivos . Ejemplo.xlsx
×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.