Problema al actualizar una hoja de excel..

Tengo una hoja de excel que debe actualizarse cuando entro en la ultima escribo en la ultima columna, pero los datos son entrados a través de un textbox simultáneamente, es por eso que debe actualizarse cuando abro la hoja nuevamente, en mi caso solo cambia cuando cambio la ultima columna manualmente, he anadidido además una sub para actualizar la hoja pero tampoco funciona.

Necesito que ayuda al respecto.

A continuación dejo la hoja, y el código:

Código:

Public fila As String
Private Sub Worksheet_Activate()
On Error Resume Next
fila = 5
Sheets("Fertigungsauftrag").Cells(fila, 3).Select
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
'On Error Resume Next
pass = "chevo"
Sheets("Fertigungsauftrag").Unprotect pass
'solo se ejecuta si se modifica la columna g
If Target.Column = 7 Then
fila = ActiveCell.Row

Dim uf, ucw, r1, r2 As String
Dim x, ucn As Integer

Sheets("Fertigungsauftrag").Select
'determines last row with data

uf = Sheets("Fertigungsauftrag").Range("c" & Rows.Count).End(xlUp).Row
uc = Sheets("Fertigungsauftrag").Cells("3," & Columns.Count).End(xlToRight).Address(False, False)
ucw = Mid(uc, 2, 1)
ucn = Sheets("Fertigungsauftrag").Cells("5," & Columns.Count).End(xlToRight).Column

x = 1

'will help determine ranges to sort data
k = Sheets("Fertigungsauftrag").Cells(6, 3).Address(False, False) '(3=C;6=6 =C6 ROW)
k1 = Mid(k, 1, 1)
r1 = k & ":" & k1 & uf
r2 = "C5:" & ucw & uf
'sorts the data
ActiveWorkbook.Worksheets("Fertigungsauftrag").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Fertigungsauftrag").Sort.SortFields.Add Key:=Range(r1) _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Fertigungsauftrag").Sort
.SetRange Range(r2)
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'Cells.Select
'Selection.Copy Destination:=Sheets("Hoja2").Range("A1")
'Sheets("hoja2").Select
Sheets("Fertigungsauftrag").Select
End If
Application.ScreenUpdating = False
End Sub

Sub XXX()
ActiveSheet.Unprotect "chevo"

ActiveWorkbook.RefreshAll
ActiveSheet.Protect
End Sub

1 Respuesta

Respuesta
1

En el evento Activate solamente seleccionas una celda. Para que actualice algo debes ejecutar una macro que actualice.

Cuando pongas el código aquí, hazlo con el botón insertar código. De esa manera es más fácil de leer. O hay alguna razón por ña cual no lo haces, me gustaría saberla.

Para ayudarte necesito saber esta información:

Responde en el siguiente orden:

1. ¿Cuál hoja quieres ordenar?

2. ¿De cuál columna a cuál columna están los datos?

¿3 . En cuál fila empiezan los datos?

4. Pon aquí el código del formulario que actualiza la hoja.

Tu macro para ordenar tiene muchos errores.


Cambia todo tu código por lo siguiente:

Private Sub Worksheet_Activate()
  Call Macro_Ordenar
End Sub
'
Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Column = 7 Then
    Call Macro_Ordenar
  End If
End Sub
'
Sub Macro_Ordenar()
  Dim r As Range
  Dim pass As String
  pass = "chevo"
  Set r = Range("C5", Cells(Range("C" & Rows.Count).End(3).Row, Cells(5, Columns.Count).End(1).Column))
  Sheets("Fertigungsauftrag").Unprotect pass
  r.Sort key1:=Range("C5"), order1:=xlAscending, Header:=xlYes
  Sheets("Fertigungsauftrag").Protect pass
End Sub

Para que funcione el evento Activate, el código debe estar en la hoja "Fertigungsauftrag".

Para insertar el código en la hoja "Fertigungsauftrag", presiona clic derecho del mouse sobre la hoja "Fertigungsauftrag", en el menú que aparece, selecciona Ver código.

En el panel que se abre debes poner el código.

Me gustaris ponerla en el botón de entrar los datos  como sería 

¿A qué te refieres?

Solamente asignar la macro Macro_Ordenar al botón que desees.

Quiero ordenar la hoja Fertigungsauftrag los datos se incorporan en la columna c hasta la columna G

Al modificar la columna G deben actualizarse los datos

Tu me dices;

Cuando pongas el código aquí, hazlo con el botón insertar código. De esa manera es más fácil de leer. O hay alguna razón por ña cual no lo haces, me gustaría saberla.
Qué  botón? No entiendo 

Quita todo tu código y pon este código:

Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Column = 7 Then
    Dim r As Range
    Dim pass As String
    pass = "chevo"
    Set r = Range("C5", Range("G" & Range("C" & Rows.Count).End(3).Row))
    Sheets("Fertigungsauftrag").Unprotect pass
    r.Sort key1:=Range("C5"), order1:=xlAscending, Header:=xlYes
    Sheets("Fertigungsauftrag").Protect pass
  End If
End Sub

Prueba y comentas

Tu me dices
Cuando pongas el código aquí, hazlo con el botón insertar código.
De esa manera es más fácil de leer.
O hay alguna razón por ña cual no lo haces, me gustaría saberla.
¿Qué botón? No entiendo

Olvida eso.



Solamente cambia todo tu código por esto y listo.

Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Column = 7 Then
    Dim r As Range
    Dim pass As String
    pass = "chevo"
    Set r = Range("C5", Range("G" & Range("C" & Rows.Count).End(3).Row))
    Sheets("Fertigungsauftrag").Unprotect pass
    r.Sort key1:=Range("C5"), order1:=xlAscending, Header:=xlYes
    Sheets("Fertigungsauftrag").Protect pass
  End If
End Sub

¡Gracias 

no tiene precio la ayuda que das 

Gracias

yo pienso que mi hoja no se actualiza porque tengo dentro lo siguiente

Puede ser eso? pues se mantiene igual

Eusebio

Private Sub CommandButton1_Click()
UserForm9.Show 0
End Sub

Sub ImprimeHojaOculta()
Application.ScreenUpdating = False
With Sheets("Tabelle5")
.visible = True
.PrintOut
.visible = False
End With
Application.ScreenUpdating = True
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 7 Then
Dim r As Range
Dim pass As String
pass = "chevo"
Set r = Range("C5", Range("G" & Range("C" & Rows.Count).End(3).Row))
Sheets("Fertigungsauftrag").Unprotect pass
r.Sort key1:=Range("C5"), order1:=xlAscending, Header:=xlYes
Sheets("Fertigungsauftrag").Protect pass
End If
End Sub

Lo he probado sin el código y tampoco se actualiza, solamente manual, cuando introduzco datos en la columna 7

Saludos

Eusebio

Todo funciona, pero solo cuando introduzco datos en la columna 7 manualmente, algo debe andar mal en mi libro, pues existe hoja que es parecida que se llama ""Fertigungsauftrag St_Bu"", pero que debe actualizarse en cuando modifico la columna 6 y tmpoco se actuliza automaticamente sino cuando entro manualmente en la columna 6 los datos

Eusebio

Si modificas la columna 7 entonces se activa el evento y ordena la información. Eso es lo que quieres.

¿Entonces en qué otro momento quieres que se ordene la información?

Puedes compartir tu libro en googledrive, de es manera descargo el archivo y lo reviso.

¡Gracias! Luego te lo envío

https://drive.google.com/file/d/1TArOEwkjX8mQJtqwRfgUL7HXsJIwrfMg/view?usp=sharing 

Importante: cuando aprieto el botón de imprimir las hojas deben estar actulizadas es decir ordenadas alfabéticamente

Gracias

Es complicado entender lo que quieres.

La macro con el evento change es para una hoja y la hoja que imprimes es otra diferente.

Si quieres ordenar la hoja "tablle5" entonces antes de imprimir debes ordenar el rango.

Yo deseo imprimir simultáneamente las tabelle 5 ytabelle 6 y ellas funcionan correctamente lo único que no funciona es que las tabelles 5 y tabelle6 se me ordenen con tu código alfabetamenteyluegos que se impriman,, yo estoy en mi limite.

Me puedes decir que debo hacer.

Yo necesito esas dos hojas imprimirlas desde el botón imprimir estando las hojas hojas ocultas.

Saludos

Eusebio

Yo también estoy al límite. Primero pides que se ordene una hoja "Fertigungsauftrag"

Luego comentas que tienes problemas en la hoja "Fertigungsauftrag St_Bu"

Y ahora que quieres imprimir las hojas "Tabelle5" y "Tabelle6"

Como yo lo veo, tienes varias peticiones y no pides las cosas en orden y por eso creas confusión.

No me entendiste yo no tengo ningunproblema con esas hojas lo esas hojas son casi idénticas se diferencian en que una tiene una columna más que otra yo lo que quiero es que las dos se actaulaicen cuando entro los datos automáticamente para podermas imprimir.

Por favor pon el siguiente código en la hoa fertigungsauftrag y analisala, ese código funciona idéntico al tuyo, pero con el mismo problema, es decir que no se ordena automáticamente sino cuando cambio la fila 7. Este código va también en la hoja Fertigungsauftrag St_Bu pero en veces de 7 va 6

Public fila As String
Private Sub Worksheet_Activate()
On Error Resume Next
fila = 5
Sheets("Fertigungsauftrag").Cells(fila, 3).Select
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
'On Error Resume Next
pass = "chevo"
Sheets("Fertigungsauftrag").Unprotect pass
'solo se ejecuta si se modifica la columna g
If Target.Column = 7 Then
fila = ActiveCell.Row

Dim uf, ucw, r1, r2 As String
Dim x, ucn As Integer


Sheets("Fertigungsauftrag").Select
'determines last row with data

uf = Sheets("Fertigungsauftrag").Range("c" & Rows.Count).End(xlUp).Row
uc = Sheets("Fertigungsauftrag").Cells("3," & Columns.Count).End(xlToRight).Address(False, False)
ucw = Mid(uc, 2, 1)
ucn = Sheets("Fertigungsauftrag").Cells("5," & Columns.Count).End(xlToRight).Column

x = 1

'will help determine ranges to sort data
k = Sheets("Fertigungsauftrag").Cells(6, 3).Address(False, False) '(3=C;6=6 =C6 ROW)
k1 = Mid(k, 1, 1)
r1 = k & ":" & k1 & uf
r2 = "C5:" & ucw & uf
'sorts the data
ActiveWorkbook.Worksheets("Fertigungsauftrag").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Fertigungsauftrag").Sort.SortFields.Add Key:=Range(r1) _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Fertigungsauftrag").Sort
.SetRange Range(r2)
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'Cells.Select
'Selection.Copy Destination:=Sheets("Hoja2").Range("A1")
'Sheets("hoja2").Select
Sheets("Fertigungsauftrag").Select
End If
Application.ScreenUpdating = False
End Sub

Ya te había comentado que tu código tiene varias fallas

Debes utilizar mi código. Solamente cambia el rango de datos

Set r = Range("C5", Range("G" & Range("C" & Rows.Count).End(3).Row))

Cambia la G por la letra de la columna final, si es la H:

Set r = Range("C5", Range("H" & Range("C" & Rows.Count).End(3).Row))

Pero la hoja no varia y no se ordena alfabéticamente. Si recibiste lo que te envíe prueba eintroduce datos en la hoja y veras que se matienen invariable .

Eusebio

No puedo hacer pruebas porque no entiendo qué necesitas.

Y no puedo descargar el archivo. No tengo acceso, debes cambiar el acceso al archivo para que yo lo pueda descargar.

Ok después lo envío de nuevo, lo que necesito es que se actualice con el botón click de entrada o salvar datos en esas hojas

Te lo he enviado por Onedrive, directo a tú correo

Eusebio

Ufff. Tienes muchos problemas en tu código.

Pon atención para corregir los problemas:

1. En muchas líneas de tu código tienes esta instrucción:

Application.EnableEvents = False

Esa instrucción es para "apagar" los eventos. Si no "activas" nuevamente los eventos, entonces al escribir en la columna 7 no se activará la macro. Por eso a veces te funciona y a veces sí.

Entonces debes eliminar esa línea en todos tus códigos.


2. Las hojas de excel tienen 3 nombres:

a) El nombre de usuario, en tu ejemplo la hoja se llama: "Fertigungsauftrag"

b) El nombre interno, CodeName, para el mismo ejemplo se llaman: Tabelle5

c) El número de hoja, según la posición de la hoja se le asigna un índice. En tu ejemplo la hoja tiene el número 4.

Entonces, el problema que tiene tu código es que pones el CodeName entre comillas:

With Sheets("Tabelle5")

Lo correcto es:

With Sheets("Fertigungsauftrag") 

O también puedes utilizar el CodeName así:

With Tabelle5

O también puedes utilizar el índice de la hoja:

With sheets(4)

3. En un módulo pon el siguiente código:

Sub OrdenaDatos(hoja As String)
  Dim pass As String
  pass = "chevo"
  With Sheets(hoja)
    .Unprotect pass
    .Range("C5:G38").Sort key1:=.Range("C5"), order1:=xlAscending, Header:=xlYes
    .Protect pass
  End With
End Sub

4. En el código de tu hoja "Fertigungsauftrag" borra todo tu código y pon el siguiente:

Private Sub CommandButton1_Click()
  UserForm9.Show 0
End Sub
'
Sub ImprimeHojaOculta()
  With Sheets("Fertigungsauftrag")
    Call OrdenaDatos(.Name)
    .visible = True
    .PrintOut
    .visible = False
  End With
End Sub
'
Private Sub Worksheet_Activate()
  Call OrdenaDatos("Fertigungsauftrag")
End Sub
'
Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Column = 7 Then
    Call OrdenaDatos("Fertigungsauftrag")
  End If
End Sub

5. En el código de tu hoja "Fertigungsauftrag St_Bu" borra todo tu código y pon el siguiente:

Private Sub CommandButton1_Click()
  UserForm9.Show 0
End Sub
'
Sub ImprimeHojaOculta()
  With Sheets("Fertigungsauftrag St_Bu")
    Call OrdenaDatos(.Name)
    .visible = True
    .PrintOut
    .visible = False
  End With
End Sub
'
Private Sub Worksheet_Activate()
  Call OrdenaDatos("Fertigungsauftrag St_Bu")
End Sub
'
  If Target.Column = 7 Then
    Call OrdenaDatos("Fertigungsauftrag St_Bu")
  End If
End Sub

Si sigues las instrucciones paso a paso, las macros van a funcionar correctamente.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas