# Referir TextBox a una Celda



## gustavomeeuwes (Aug 15, 2010)

Hola a Todos.
Tengo una celda, A1 donde escribo un comentario.
El ancho y alto de esta celda es limitado , por lo que si el comentario es muy largo no se ve completamente, por lo que quería ponerle un botón para expandir este comentario usando una macro con TextBox.
Y despues un botón para borrarla.

Grabo la macro:
1- Creo el TextBox.
2- Boton derecho sobre el Textbox -> Propiedades -> Editor VB -> Voy a LinkedCell y le asigno A1 y en MultiLine le pongo True.
Listo. El textBox se ve perfecto.

Lo borro, ejecuto la macro, me aparece el TextBox pero en blanco.
Edito la Macro y no hace referencia ni a LinkedCell ni a MultiLine. En las propiedades del TextBox tampoco aparecen.

ActiveSheet.OLEObjects.Add(ClassType:="Forms.TextBox.1", Link:=False, 
 DisplayAsIcon:=False, Left:=51.75, Top:=315, Width:=178.5, Height:=54.75).Select

Probé de agregarle a mano el LinkedCell y MultiLine

ActiveSheet.OLEObjects.Add(ClassType:="Forms.TextBox.1", Link:=False,  DisplayAsIcon:=False, Left:=51.75, Top:=315, Width:=178.5, Height:=54.75, LinkedCell:"A1", MultiLine:=True).Select

o, como ví por ahí hacerlo con un object:

ActiveSheet.OLEObjects.Add(ClassType:="Forms.TextBox.1", Link:=False, DisplayAsIcon:=False, Left:=51.75, Top:=315, Width:=178.5, Height:=54.75).Select
Obejct.LinkedCell:"A1"
Object.MultiLine;=True
End Sub

O tambien
ActiveSheet.OLEObjects.Add(ClassType:="Forms.TextBox.1", Link:=False,  DisplayAsIcon:=False, Left:=15.75, Top:=313.5, Width:=139.5, Height:=53.25).Select
Sheets("Nombre").Select
Range("A1").Select
TextBox1.Text = ActiveCell.Value

Ninguna funciona.
Agradecería vuestra ayuda.
Saludos
Gustavo


----------



## Greg Truby (Aug 16, 2010)

Bueno, antes de todo me pregunto por qué no se usa un comentario en vez de un textbox.  Sería mucho más fácil.

Pero bien, con un textbox, en vez de poner el texto en forma permanente me parece que sería mejor vincular el texto con la celda y así si el texto en la celda cambia, el texto en la caja cambiará también.


```
Sub foofoo()
    Dim shpTextBox As Shape
    
    Set shpTextBox = ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, _
                     400, 40, 300, 80)
                
    With shpTextBox
        .Name = "Gustavo"
        .DrawingObject.Formula = "=A1"
    End With
End Sub
```


----------



## Greg Truby (Aug 16, 2010)

Oops.  Ya vi que usted usó un control y no una forma (shape).  Con un control sería algo como:
	
	
	
	
	
	



```
Sub foofoofoo()
    
    Dim oleTextBox As OLEObject
    
    
    Set oleTextBox = ActiveSheet.OLEObjects.Add(ClassType:="Forms.TextBox.1", _
                        Link:=False, DisplayAsIcon:=False, _
                        Left:=300, Top:=200, Width:=200, Height:=40)
    
    oleTextBox.LinkedCell = "$A$1"
End Sub
```


----------



## gustavomeeuwes (Aug 16, 2010)

Gracias Greg.
Me dice que con un comenario sería más facil. Como sería?
Pero antes que nada le comento para que no se tome el trabajo:
En la planilla estas hojas donde quiero hacer esto despues las copio y guardo en un libro nuevo (Selecciono las hojas -> Botón Derecho Mouse -> Mover o Copiar -> Crear una Copia en un Nuevo Libro). Al guardarlas las macros no se copian, por lo que no me sirve ya que esto debería estar disponible también en esas copias creadas. Por lo que ví las macros se deben copiar a mano, entrando al editor de VB.
Si esto es así debería hacerlo con una función interna del excel, pero hasta donde sé no hay ninguna para hacer esto. Solo se me ocurrió hacerlo por hipervínculos, creando una nueva hoja con un tamaño de celda más grande y redireccionando.
Espero tus comentarios y muchas gracias.
Saludos.
Gustavo


----------



## Greg Truby (Aug 17, 2010)

Una solución usando comentarios sería algo como:


```
Private Sub Worksheet_Change(ByVal Target As Range)
    
    Const c_strRangeToComment As String = "rngToComment"
    Const c_lngMaxLen As Long = 20  '// máx de letras desplegables
    Dim rngToComment As Excel.Range, rngCell As Excel.Range, _
        rngIntersection As Excel.Range, _
        cmtComment As Excel.Comment, strComment As String

    On Error Resume Next
    '// vamos a ver si existe un rango con el nombre que
    '// buscamos a nivel de la hoja activa
    Set rngToComment = Range("c_strrangetocomment")
    If rngToComment Is Nothing Then
        Err.Clear
        '// si no hubo a nevel de hoja, vemos si hay a nivel
        '// del cuaderno.
        Set rngToComment = ThisWorkbook.Names(c_strRangeToComment).RefersToRange
        '// si no hubo, salimos
        If rngToComment Is Nothing Then Exit Sub
    End If
    
    '// vemos si TARGET pertenece a las celdas que
    '// nos interesan.
    Set rngIntersection = Application.Intersect(Target, rngToComment)
    If rngIntersection Is Nothing Then Exit Sub
    
    '// puede ser que varios valores eran metidos en varias
    '// celdas a la misma vez.
    For Each rngCell In rngIntersection.Cells
    
        If Len(rngCell.Value) > 20 _
        And Not IsNumeric(rngCell.Value) Then
            
            Set cmtComment = rngCell.Comment
            
            If cmtComment Is Nothing Then
                '// si no existe un comentario añadir uno
                rngCell.AddComment rngCell.Value
            Else
                '// si ya tenía un comentario, añadir el valor
                '// de la celda al comentario
                With cmtComment
                    .Text Text:=vbCrLf & vbCrLf & rngCell.Value, _
                          Start:=Len(.Text) + 1, _
                          Overwrite:=False
                End With
            End If
            
        End If
    Next rngCell
    
    '// favor note que la solución aquí padece de la falta de una
    '// manera de quitar texto viejo del comentario para ponerlo al día
    '// cuando el valor cambia la segunda vez.  Dejo este ejercicio al lector.
End Sub
```
 
En cuanto a su problema de copiar hay tres senderos principales que llegan a una solución:

Usar el VBIDE y una vez de haber hecho el cuaderno nuevo importar código al cuaderno por medio de variables string o archivos de texto.
Poner todo su código en un Add-In y programar tal Add-In para que revise todos los cuadernos cada vez que se abre uno y tomar acción cuando se debe (esto es la solución más profesional pero es bastante complicado).
Copiar todo el cuaderno entero y suprimir las hojas que no se ocupa del cuaderno nuevo (probablemente la solución más sencilla).
Atte,


----------



## gustavomeeuwes (Aug 17, 2010)

Hola Greg:
Nuevamente gracias por el soporte y ayuda.
Creo que con esto ya no lo molestaré (al menos por un tiempo)
Un cordial saludo.
Gustavo


----------

