Todo se publica por Israel Cassales
-
Hola, La explicación es sencilla y se entiende por ser directa. Las posibles opciones no tanto porque dejan múltiples conjeturas a la deducción y como eso no ayuda, participaré con una posibilidad que se enfoca en lo descrito solamente. Agregar que en su perfil no está visible su versión de Excel así que también mi recomendación será desde la versión más baja que tengo que es 2013. {=CONTAR(INDIRECTO(SI.ERROR(DIRECCION(FILA(),COINCIDIR(VERDADERO,ESBLANCO(A2:E2),0),4),DIRECCION(2,1,4))):E2)} Ahora, ¿recuerda que mencione las conjeturas? ¿La fecha que sirve de búsqueda puede cambiar? Entonces use un COINCIDIR () de manera adicional. ¿La fecha a COINCIDIR es para todas las filas? Si la respuesta es no, entonces podría afectar su diseño. ¿Los criterios de conteo siempre serán números? Si hubiera TEXTO como un SI, o un NO, entonces las fórmulas deben cambiarse. ¿Sólo hay una celda vacía por fila? ¿Tienen versión 365? Puede combinar funciones de FILTRAR(), TRANSPONER(), ORDENAR() con las usadas en el ejemplo. El ejemplo debería servir con las condiciones tal cual usted las señalo, si algo cambia deberá personalizar para encontrar el resultado buscado. Con buenos deseos, quedo de usted.
-
Cumpleaños Foro.xlsm
-
Maestro @John Jairo V me parece que hay un detalle donde el consultante no está considerando (o tal vez no sea sobresaliente). Sr. @pinoji ¿Son años cumplidos? La fórmula propuesta por el maestro cumple con la solicitud, pero si se analizan en la tabla de ejemplos hay dos (pero podrían ser más) donde el año completo no se ha cumplido. Como se está comparando contra la fecha de HOY(), el ejemplo Diciembre y Noviembre aún no llega, así que los individuos involucrados no tienen la edad descrita. Seguramente no importa porque se busca la fecha de cumpleaños. Si lo desea y busca ser exacto con los años le propongo evaluar la comparación de los años con argumentos de AÑO, MES y DIA =AÑO(HOY()) - AÑO(M22) - (SI(O(MES(HOY()) < MES(M22), Y(MES(HOY()) = MES(M22), DIA(HOY()) < DIA(M22))), 1, 0))
-
¡Vaya! Eso sí es un problema. Te puedo recomendar las opciones que conozco aunque ninguna es garantía de que lo soluciones, sería intentar. Usa la función “Abrir y reparar” de Excel Sube el archivo a Google Drive y ábrelo con Google Sheets. A veces puede abrir archivos que Excel no puede. Cambia la extensión como .xlsx o .xls y luego ábrelo nuevamente en Excel Existen herramientas como Stellar Repair for Excel que en ocasiones ayudan a reparar archivos dañados ¡Suerte!
-
Hola, Ando en el móvil lo que me complica ver los libros que usted adjunto. De acuerdo al desarrollo de su consulta lo que puedo recomendarle es cerrar todos los objetos cuando no se estén utilizando. Por ejemplo después de cerrar el libro, puede liberar la memoria asignada al objeto usando: Set wb = Nothing Por si fuera un tema de memoria intente usted desactivar los complementos de Excel que no esté utilizando, ya que pueden consumir memoria innecesariamente.
-
Hola, Es importante saber que versión de SAP utiliza para poder recibir una ayuda mejor estructurada, su error por lo regular es por que hay un problema con la forma en que está intentando acceder al motor de scripting de SAP Le recomiendo: Verifique que el scripting de SAP esté habilitado: Tiene que estar habilitado tanto en el servidor como en el cliente, revise desde la configuración de SAP GUI. Revise que las referencias estén correctamente configuradas: En el VBA, Herramientas > Referencias y revise que las referencias a las bibliotecas necesarias de SAP estén seleccionadas. Debería tener algo como “SAP GUI Scripting API” marcado. Si después de eso sigue teniendo problemas, revise la documentación de SAP GUI Scripting o amplié la búsqueda de ayuda en foros de SAP Por otro lado, hay formas de hacer esto en SAP. Puede usar el scripting directamente dentro del entorno de SAP para automatizar tareas repetitivas. Similar a lo que esta intentando hacer con Excel, pero dentro de SAP. Un ejemplo del escript: If Not IsObject(application) Then Set SapGuiAuto = GetObject("SAPGUI") Set application = SapGuiAuto.GetScriptingEngine End If If Not IsObject(connection) Then Set connection = application.Children(0) End If If Not IsObject(session) Then Set session = connection.Children(0) End If session.findById("wnd[0]").maximize session.findById("wnd[0]/tbar[0]/okcd").text = "ME21N" session.findById("wnd[0]").sendVKey 0 ' Añada aquí el resto de las acciones que desea automatizar Si necesita que el script interactúe con datos de un archivo Excel, puede actualizar el script para leer datos. Así sería un ejemplo de cómo hacerlo: Dim objExcel, objWorkbook, objSheet Set objExcel = CreateObject("Excel.Application") Set objWorkbook = objExcel.Workbooks.Open("C:\ruta\del\archivo.xlsx") Set objSheet = objWorkbook.Sheets(1) Dim i i = 2 ' Asumiendo que los datos empiezan en la fila 2 Do While objSheet.Cells(i, 1).Value <> "" ' Use los datos de Excel en tu script session.findById("wnd[0]/usr/ctxtEBAN-BANFN").text = objSheet.Cells(i, 1).Value i = i + 1 Loop objWorkbook.Close objExcel.Quit
-
Por la descripción se me ocurren un par de cosas que recomendarte, una podría ser la configuración de la región, así que en donde no se "abre" bien revisa que el separador de listas sea una coma. La otra no mencionas como lo mandas llamar pero se puede deducir que haces doble clic, así que igualmente en la que no abre bien prueba importar "manualmente" el .csv
-
Lo lamento @joseppp La columna A está vacía y eso no me permitió entender en plenitud tu consulta, parece que al poner en C15 el número que llamas ID lo debe buscar en el rango de DATOS, al poner las letras A B C estás identificando en que fila esta ese mismo número pero hasta ahí, no supe interpretar que quieres devolver de A:A Para una posible ayuda deducir no es buena idea, se agradece el libro pero le externo las dudas que a mí me presentó. también podría esperar la ayuda de algún Maestro o miembro avanzado de la comunidad que lo interprete diferente.
-
CONTAR SI CON VARIOS ARGUMENTOS
tema contestó a Israel Cassales en Pablo Espinosa Fórmulas y funciones
Saludos totales, Bueno con los elementos que aporta y considerando la falta de un libro de ejemplo podría resolver su necesidad con SUMAR.SI.CONJUNTO() Fe de erratas: Dice: SUMAR.SI.CONJUNTO() Debe decir: CONTAR.SI.CONJUNTO() -
Saludos totales, Maestro @JasallBcn yo participaría variando en dos cosas, buscaría hasta la ultima fila con datos para hacer la eliminación de abajo hacia arriba, porque creo que si eliminas las filas de arriba hacia abajo, habría la posibilidad de saltarte algunas filas, porque las filas se reordenan cada vez que eliminas una ¿Qué opina? Sub BORRAR_COBRADAS() Dim i As Long Dim lastRow As Long lastRow = Cells(Rows.Count, "L").End(xlUp).Row For i = lastRow To 2 Step -1 ' Recorre de abajo hacia arriba If Range("FACTURAS!L" & i).Value = "COBRADA" Then Rows(i).EntireRow.Delete End If Next i End Sub
-
Crear una macro para ocultar Columnas vacias
tema contestó a Israel Cassales en Ppep Macros y programación VBA
rMezclaCompletamacro25 - AYUDA EXCEL.xlsb -
Crear una macro para ocultar Columnas vacias
tema contestó a Israel Cassales en Ppep Macros y programación VBA
Varios meses después... Hola, Viendo los temas de las consultas sin responder, considerando el tiempo y las descargas que han pasado en este lapso cabe mencionar que no es común la falta de participaciones. De mi parte le soy sincero, me costo entender como se desencadenan los eventos y cómo serían los pasos. Es posible que a la fecha reciente ya haya usted encontrado la solución a su consulta, así que participaré con lo que se trato de explicar en su descripción; esperando sea de utilidad para futuros lectores. Le comparto tres códigos similares, el primero solo oculta de la tabla las columnas sin datos dentro de la misma, el segundo oculta las columnas que no tienen datos visibles, y el tercero oculta y muestra datos visibles dentro de ese rango. Sub OcultarColumnasSinDatos() Dim ws As Worksheet Dim tbl As ListObject Dim col As ListColumn Dim celda As Range Dim tieneDatos As Boolean Set ws = ThisWorkbook.Sheets("Mezcla 2") Set tbl = ws.ListObjects("Tabla1") For Each col In tbl.ListColumns tieneDatos = False For Each celda In col.DataBodyRange If Not IsEmpty(celda.Value) Then tieneDatos = True Exit For End If Next celda If Not tieneDatos Then col.Range.EntireColumn.Hidden = True Else col.Range.EntireColumn.Hidden = False End If Next col End Sub Sub OcultarColumnasSinDatos_2() Dim ws As Worksheet Dim tbl As ListObject Dim rng As Range Dim col As ListColumn Dim cell As Range Dim colHidden As Boolean Set ws = ThisWorkbook.Sheets("Mezcla 2") Set tbl = ws.ListObjects("Tabla1") For Each col In tbl.ListColumns colHidden = True For Each cell In col.DataBodyRange.SpecialCells(xlCellTypeVisible) If Not IsEmpty(cell.Value) Then colHidden = False Exit For End If Next cell col.Range.EntireColumn.Hidden = colHidden Next col End Sub Sub OcultarColumnasSinDatos_3() Dim ws As Worksheet Dim tbl As ListObject Dim rng As Range Dim col As ListColumn Dim cell As Range Dim colHidden As Boolean Dim filterActive As Boolean Dim i As Integer Set ws = ThisWorkbook.Sheets("Mezcla 2") Set tbl = ws.ListObjects("Tabla1") filterActive = False For i = 1 To tbl.Range.Columns.Count If tbl.AutoFilter.Filters(i).On Then filterActive = True Exit For End If Next i If Not filterActive Then tbl.Range.EntireColumn.Hidden = False Exit Sub End If For Each col In tbl.ListColumns colHidden = True For Each cell In col.DataBodyRange.SpecialCells(xlCellTypeVisible) If Not IsEmpty(cell.Value) Then colHidden = False Exit For End If Next cell col.Range.EntireColumn.Hidden = colHidden Next col End Sub Por otro lado es posible que desee usar el filtro como un detonante, entonces aunque hay consideraciones que especificar, en general debería ser útil desencadenar con el cambio en la tabla en su hoja activa. Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable) Es cuestión de que se hagan pruebas. Saludines -
Y unos meses después... Hola, He visto su tema en consultas sin respuestas, además que por el tiempo que ha pasado y las descargas en su libro no es común no haber recibido alguna propuesta, aunque por los meses transcurridos es posible que usted haya resuelto su necesidad. Por aportar algo que pudiera servir (no sé a usted pero tal vez) a los lectores futuros dejaré una idea de acuerdo a lo que entendí en su descripción. Entiendo que su Listview1 de momento solo está filtrando por el ROL, así que agregare que también filtre por el NÚMERO. En caso de servir, bastaría replicar para los demás Combobox. Dim Número As Variant Dim Celda As Range Private Sub ListView1_DblClick() Set Celda = Hoja2.Columns("A").Find(Número, , , xlWhole) Celda.Offset(, 7).Hyperlinks(1).Follow NewWindow:=True End Sub Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem) Número = Item End Sub Private Sub Buscar_Change() FiltrarDatos End Sub Private Sub Buscar1_Change() FiltrarDatos End Sub Private Sub FiltrarDatos() Dim Vb As String, Vb1 As String Dim Fx As Integer Dim co As Integer, co1 As Integer Dim Ve As String, Ve1 As String Vb = Buscar.Text Vb1 = Buscar1.Text If BUOP = "ROL" Then co = 2 ElseIf BUOP = "NUMERO" Then co = 3 ElseIf BUOP = "FECHA" Then co = 4 ElseIf BUOP = "MATERIA" Then co = 5 ElseIf BUOP = "LOTEO O SECTOR" Then co = 6 ElseIf BUOP = "DEPARTAMENTO" Then co = 7 ElseIf BUOP = "CO" Then co = 8 End If If BUOP1 = "ROL" Then co1 = 2 ElseIf BUOP1 = "NUMERO" Then co1 = 3 ElseIf BUOP1 = "FECHA" Then co1 = 4 ElseIf BUOP1 = "MATERIA" Then co1 = 5 ElseIf BUOP1 = "LOTEO O SECTOR" Then co1 = 6 ElseIf BUOP1 = "DEPARTAMENTO" Then co1 = 7 ElseIf BUOP1 = "CO" Then co1 = 8 End If Fx = 2 ListView1.ListItems.Clear With Hoja2 While .Cells(Fx, 1).Value <> Empty Ve = .Cells(Fx, co).Value Ve1 = .Cells(Fx, co1).Value If UCase(Ve) Like "*" & UCase(Vb) & "*" And UCase(Ve1) Like "*" & UCase(Vb1) & "*" Then Set LI = ListView1.ListItems.Add(Text:=.Cells(Fx, 1).Value) LI.SubItems(1) = .Cells(Fx, 2).Value LI.SubItems(2) = .Cells(Fx, 3).Value LI.SubItems(3) = .Cells(Fx, 4).Value LI.SubItems(4) = .Cells(Fx, 5).Value LI.SubItems(5) = .Cells(Fx, 6).Value LI.SubItems(6) = .Cells(Fx, 7).Value LI.SubItems(7) = .Cells(Fx, 8).Value End If Fx = Fx + 1 Wend End With Me.Lblsku = "Archivos: " & ListView1.ListItems.Count End Sub Private Sub UserForm_Initialize() With Me .Width = Application.Width .Height = Application.Height End With BUOP = "ROL" With Me.BUOP .Clear .AddItem "ROL" End With BUOP1 = "NUMERO" With Me.BUOP1 .Clear .AddItem "NUMERO" End With BUOP2 = "FECHA" With Me.BUOP2 .Clear .AddItem "FECHA" End With BUOP3 = "MATERIA" With Me.BUOP3 .Clear .AddItem "MATERIA" End With BUOP4 = "LOTEO O SECTOR" With Me.BUOP4 .Clear .AddItem "LOTEO O SECTOR" End With BUOP5 = "DEPARTAMENTO" With Me.BUOP5 .Clear .AddItem "DEPARTAMENTO" End With Dim Fx As Integer Dim LI As ListItem With ListView1 .Gridlines = True .CheckBoxes = False .View = lvwReport .FullRowSelect = True With .ColumnHeaders .Clear .Add , , "CO", 0 .Add , , "ROL", 50, 0 .Add , , "NUMERO", 60, 0 .Add , , "FECHA", 60, 2 .Add , , "MATERIA", 300, 0 .Add , , "LOTEO O SECTOR", 150, 0 .Add , , "DEPARTAMENTO", 100, 0 .Add , , "ENLACE", 50, 0 End With End With Fx = 2 With Hoja2 Do Until .Cells(Fx, 1) = "" Set LI = ListView1.ListItems.Add(Text:=.Cells(Fx, 1).Value) LI.SubItems(1) = .Cells(Fx, 2).Value LI.SubItems(2) = .Cells(Fx, 3).Value LI.SubItems(3) = .Cells(Fx, 4).Value LI.SubItems(4) = .Cells(Fx, 5).Value LI.SubItems(5) = .Cells(Fx, 6).Value LI.SubItems(6) = .Cells(Fx, 7).Value LI.SubItems(7) = .Cells(Fx, 8).Value Fx = Fx + 1 Loop End With Me.Lblsku = "Archivos: " & ListView1.ListItems.Count End Sub Lamento no ser de más ayuda y en modo de excusa casi no participo por la sección de Macros donde aún sigo practicando. Saludines
-
Saludos totales, Considerando la respuesta del maestro ante la posibilidad de separar el resultado en dos celdas y considerando también que el consultante no desea usar macros. En esa circunstancia si nos ponemos creativos podemos sacar de la celda el resultado de la fórmula a una imagen. Su formula renombrada: =SI(B3=B7,"Resultado1",SI(B3=B8,"Resultado2",SI(B3=B9,"Resultado3"))) Así cuando cambie el resultado, cambiará la imagen que es una copia del resultado que tenemos en el rango inferior. Probablemente con un rango mayor de datos sea laborioso el crearlo pero es solo una idea que se me cruzo al leer la propuesta del Maestro @Victor7 a quien saludo cordialmente con el gusto de coincidir en este tema.
-
Hola, Sin el libro de ejemplo solo puedo participar en su consulta con un código como el siguiente, este debería poder encontrar la última fila utilizada en la hoja “USUARIO” y comenzar a escribir a partir de esa fila. Así, no necesita especificar manualmente la fila de inicio cada vez. Sub AÑADIRNUEVAS() Application.Calculation = xlManual Dim i As Integer Dim j As Integer ' Encuentra la última fila j = Sheets("USUARIO").Cells(Sheets("USUARIO").Rows.Count, "A").End(xlUp).Row + 1 For i = 2 To 8000 If Range("FACTURAS!L" & i) = "AÑADIR" Then Range("USUARIO!A" & j) = Range("FACTURAS!A" & i) Range("USUARIO!B" & j) = Range("FACTURAS!B" & i) Range("USUARIO!C" & j) = Range("FACTURAS!C" & i) Range("USUARIO!D" & j) = Range("FACTURAS!D" & i) Range("USUARIO!E" & j) = Range("FACTURAS!E" & i) Range("USUARIO!F" & j) = Range("FACTURAS!F" & i) Range("USUARIO!G" & j) = Range("FACTURAS!G" & i) Range("USUARIO!H" & j) = Range("FACTURAS!H" & i) Range("USUARIO!I" & j) = Range("FACTURAS!I" & i) Range("USUARIO!J" & j) = Range("FACTURAS!J" & i) j = j + 1 End If Next i ' Limpia las celdas restantes por si hace falta While Range("USUARIO!A" & j) <> "" Range("USUARIO!A" & j) = "" Range("USUARIO!B" & j) = "" Range("USUARIO!C" & j) = "" Range("USUARIO!D" & j) = "" Range("USUARIO!E" & j) = "" Range("USUARIO!F" & j) = "" Range("USUARIO!G" & j) = "" Range("USUARIO!H" & j) = "" Range("USUARIO!I" & j) = "" Range("USUARIO!J" & j) = "" Range("USUARIO!K" & j) = "" Range("USUARIO!L" & j) = "" j = j + 1 Wend Application.Calculation = xlAutomatic End Sub
-
Hola, De manera personal no tengo el conocimiento para hacer que la fórmula aplique automáticamente el formato de superíndice, y no estoy seguro que se pueda hacer sin usar VBA. Creo recordar que usted evita el uso de macros en sus trabajos, pero incluso aunque fuera con macros dudo que pueda mantener la fórmula y el formato de superíndice en la misma celda, es decir; para que la macro aplique el formato debería reemplazar el resultado a texto o colocarlo en alguna celda auxiliar. Es por esta causa que no puede aplicar manualmente el superíndice al seleccionar la parte de la fórmula, Excel le deshabilita el menú. Aún así, habría que esperar si hay otras participaciones que le aporten alguna posible solución.
-
Hola, Estaba viendo los temas de la sección sin respuestas y llama la atención el suyo porque a pesar de tener tantas descargas al momento no ha tenido más participación. Una causa podría ser lo extenso. Solo por darle una idea general a sabiendas que debe personalizar una opción de código podría ser así: Sub BuscarCoincidencias() Dim wsBase As Worksheet Dim wsPozo As Worksheet Dim pozo As String Dim fecha As Range Dim jornada As Range Dim actividad As String Dim filaBase As Long Dim filaPozo As Long Dim columnaFecha As Long Dim columnaJornada As Long Dim actividades As Variant Dim i As Long ' Definir las hojas de trabajo Set wsBase = ThisWorkbook.Sheets("Base de datos") Set wsPozo = ThisWorkbook.Sheets("Pozo 3") ' Obtener el pozo de la celda K2 pozo = wsPozo.Range("K2").Value ' Definir las actividades a buscar actividades = Array("MOV. HTA. (PRUEBAS)", "MOV. HTA.(MEDICION POZO)", "MOV. HTA. POR TRONADURA", _ "MEDICION TELEVIWER", "MEDICION DE POZO CLIENTE", "ESPERA POR TRONADURA", _ "MOV. SONDA POR TRONADURA", "ESPERA DE ACCESO", "ESPERA DE PLATAFORMA CLIENTE", _ "ESPERA DE MEDICION CLIENTE", "ESPERA DE INSTRUCCIONES CLIENTE", "VIDEO POZO") ' Recorrer las fechas en la hoja "Pozo 3" For Each fecha In wsPozo.Range("E10:BP10") columnaFecha = fecha.Column ' Recorrer las jornadas en la hoja "Pozo 3" For Each jornada In wsPozo.Range(wsPozo.Cells(11, columnaFecha), wsPozo.Cells(11, columnaFecha + 1)) columnaJornada = jornada.Column ' Recorrer las actividades For i = LBound(actividades) To UBound(actividades) actividad = actividades(i) ' Buscar coincidencias en la hoja "Base de datos" filaBase = 2 ' Asumiendo que los datos empiezan en la fila 2 Do While wsBase.Cells(filaBase, 1).Value <> "" If wsBase.Cells(filaBase, 2).Value = pozo And _ wsBase.Cells(filaBase, 3).Value = fecha.Value And _ wsBase.Cells(filaBase, 4).Value = jornada.Value And _ wsBase.Cells(filaBase, 5).Value = actividad Then ' Colocar las horas realizadas en la hoja "Pozo 3" wsPozo.Cells(15, columnaJornada).Value = wsBase.Cells(filaBase, 6).Value Exit Do End If filaBase = filaBase + 1 Loop Next i Next jornada Next fecha End Sub Le recomiendo ir por partes y seccionar su consulta en resultado por resultado.
-
Hola, Por el tiempo que ha transcurrido es posible que haya avanzado en su necesidad por usted mismo. Para dejar una sugerencia en el foro y los posibles lectores tal vez podría usar las columnas número de guía y orden de trabajo que tiene en su hoja del mismo nombre, Base de datos y crear un nuevo formulario. Para llamarlo creas un nuevo botón en el formulario principal y lo ejecutas. Este formulario debe ser capaz de buscar y actualizar los datos del tarifario, algo así: Private Sub actualizarTarifario_Click() Dim fila As Integer Dim guiaBuscar As String Dim ordenBuscar As String Dim encontrado As Boolean guiaBuscar = InputBox("Ingrese el número de guía:") ordenBuscar = InputBox("Ingrese el número de orden de trabajo:") encontrado = False With Hoja2 For fila = 3 To .Cells(.Rows.Count, 2).End(xlUp).Row If .Cells(fila, 2).Value = guiaBuscar And .Cells(fila, 3).Value = ordenBuscar Then .Cells(fila, 11).Value = InputBox("Ingrese el tarifario:") ' Añade más columnas si es necesario encontrado = True Exit For End If Next fila End With If Not encontrado Then MsgBox "No se encontró el registro con el número de guía y orden de trabajo proporcionados." Else MsgBox "Tarifario actualizado correctamente." End If End Sub
-
Saludos totales Es una gran idea @simplifikndo y lamento parecer entrometido en su aporte, me gustan las recomendaciones que hace y por eso con pena de mi parte y sin intención de modificar el total de su idea con el rango auxiliar, vi que en la parte del conteo usa esta fórmula: =SI(CONTAR.SI(U$1:U$7,">"&0)>CONTAR.SI(T$1:T$7,">"&0),CONTAR.SI(U$1:U$7,">"&0)-CONTAR.SI(T$1:T$7,">"&0),0) Usando su mismo rango tal vez le podría interesar algo así: =SUMAPRODUCTO((U1:U7>0)*(T1:T7=0)) Una disculpa por la intromisión estimado @Matías86 Duda Lanzamiento - slp.xlsx