Excel VBA, el código del programa VBA cambia el contenido de la imagen
1. ALT+F11 abre el editor VBE, crea un nuevo módulo 1, ingresa el siguiente código:
Sub picxz() 'Inserta el nombre original del archivo de imagen como nombre del gráfico, celda El tamaño se utiliza como base y la inserción se realiza en la dirección de la fila y luego en la dirección de la columna, es decir, primero A1, A2...luego B1, B2...y así sucesivamente
Dim picname Como variante, p Como forma, pname Como cadena, stly, p1 Como forma, pnamewr Como cadena, x Como byte, x1 Como byte, itop, ileft, iheight, iwidth, l Como largo, h Como largo
Const hs As Long = 65536 'Cada columna El número máximo de imágenes que se pueden insertar
stly = vbQuestion & vbYesNo
l = -Int(- Sheets("Gallery").Shapes.Count / hs) 'Número de columna
h = Sheets("Gallery").Shapes.Count - (l - 1) * hs 'Número de línea
picname = Application.GetOpenFilename(FileFilter:="Archivo de imagen (* .jpg; *.gif;*.bmp),*.jpg; *.gif;*.bmp, todos los archivos (*.*),* .*", _ Title:="Selección de imagen", MultiSelect:=False )
Si picname <> False Entonces
pname = Split(Dir(picname), "." , 2)(0) 'Obtener el nombre original del archivo de imagen
pnamewr = pname
itop = Sheets("Gallery").Cells(h, l).Top ' Determina las coordenadas
ileft = Sheets("Gallery").Cells( h, l).Left
iheight = Sheets("Gallery").Cells(h, l). Alto 'Determina el tamaño
iwidth = Sheets("Gallery").Celdas (h, l).Width
Para cada p en Sheets("Gallery").Formas si p .Name = pname Then x = MsgBox("Descubrí que ya existe una imagen con el mismo nombre en tu galería, confirma. ¿Es una imagen nueva? ", stly, "La imagen tiene el mismo nombre, ¡advertencia! ") Si x = 7, entonces salga de Sub Else
x1 = MsgBox("¿Está seguro de que necesita reemplazar la imagen denominada: "" & pname & ""?", stly, "Reemplazo de imagen, advertencia ! ")
Si x1 = 6 Entonces
itop = Sheets("Galería").Shapes(pname).Top
ileft = Sheets("Galería). " ).Shapes(pname).Left
iheight = Sheets("Galería").Shapes(pname).Height
iwidth = Sheets("Galería").Shapes(pname ) .Width
Sheets("Gallery").Shapes(pname).Delete
Else
chongshu: Si pnamewr
= "" Entonces pnamewr = InputBox("Aún no le has puesto nombre a la imagen. ¡Debes nombrarla correctamente antes de poder insertar esta imagen!", "Ponle nombre a la imagen") Else pnamewr = InputBox("Tu galería ya existe con " " & pnamewr & " "¡Es necesario cambiar el nombre de la imagen con el nombre antes de insertar esta imagen!", "Nombre de la imagen") End If If pnamewr = "" O pnamewr = pname Then
jinggao: MsgBox " ¡Advertencia! ¡Está vacío o tiene el mismo nombre! Continúe ingresando ", vbExclamación, "¡Advertencia sobre el nombre de la imagen! " Ir a chongshu Finalizar si para cada p1 en Hojas ("Galería"). Formas Si p1.Name = pnamewr Luego Ir a jinggao Siguiente Fin If End If End If
Siguiente
ActiveSheet.Pictures.Insert(picname).Select
With Selection.ShapeRange
.Name = pnamewr
.LockAspectRatio = msoFalse
.Top = itop
.Left = ileft
.Height = iheight
.Width = iwidth
.Rotation = 0#
Terminar con
Fin si
Fin Sub
2Nueva hoja de trabajo se llama: "Galería".
3 Haga clic izquierdo en el menú: Ver-Barra de herramientas-Formulario, use el botón de control en la barra de herramientas del formulario, en la hoja de trabajo de la galería, haga clic izquierdo y arrastre para dibujar un botón y cambie el nombre a Insertar. Imagen, especifique la macro como picxz y luego inserte aleatoriamente varias imágenes.
El efecto es el siguiente:
4? ALT+F11 abre el editor VBE y pega el siguiente código en ThisWorkbook:
Opción explícita
Const ofsrow As Integer = 0, ofscol As Integer = 1 'Inserte la imagen relativa a la posición de la celda, es decir, insértela en la fila de la fila, columna ofscol, posición
Private Sub Workbook_SheetCalculate(ByVal Sh As Object) p>
En caso de error, reanudar siguiente
Atenuar pic como forma, rg como rango, flagch como booleano, rng como rango, flagempty como booleano, pic1 como forma, flagcf como booleano
flagch = True 'la bandera corresponde Si hay una imagen correspondiente en la posición, el valor predeterminado es
flagempty = True 'Marca si no hay una imagen en la posición correspondiente, el valor predeterminado es
flagcf = False 'Si la imagen correspondiente en la posición correspondiente se repite, por defecto ninguna
Application.ScreenUpdating = False 'Desactivar la actualización de pantalla
Application.DisplayAlerts = False 'Activar desactivar advertencias y mensajes
Sh.UsedRange.SpecialCells(xlCellTypeFormulas ).Seleccione 'Seleccionar el rango de celdas editado que contiene fórmulas
Para cada rg en selección Para cada imagen en Sh.Shapes If InStr(1, pic.Name, "Drop Down") = 0 Entonces si pic.Name <> rg.Value y pic.TopLeftCell.Address = rg.Offset(ofsrow, ofscol).Address Entonces
Si flagch Entonces
flagch = False
Establecer rng = rg
Finalizar Si
Establecer rng = Union(rng, rg) Fin Si finaliza si es siguiente
Siguiente
Para cada rg en selección Para cada imagen en Sh.Shapes Si InStr(1, pic.Name, "Drop Down") = 0 Entonces si rg .Offset(ofsrow, ofscol).Address = pic.TopLeftCell.Address Entonces flagempty = False Finaliza si es siguiente Si flagch y flagempty Entonces establece rng = rg flagch = False Finaliza si si flagch = False Y flagempty Entonces establece rng = Union(rng, rg) flagempty = True
Siguiente
rng.Select 'Seleccione la posición correspondiente sin la imagen correspondiente
Si flagch = False Entonces
Para cada rg en selección para cada
pic In Sheets("Gallery").Shapes Si rg.Value = pic.Name Y rg.Offset(ofsrow, ofscol).Address <> pic.TopLeftCell.Address Luego 'Busque la imagen correspondiente en la galería, y no hay posición correspondiente en la posición correspondiente Imagen, luego inserte la imagen Para Cada pic1 En Sh.Shapes
Si InStr(1, pic1.Name, "Drop Down") = 0 Entonces
If pic1.TopLeftCell.Address = rg.Offset(ofsrow, ofscol).Address And pic1.Name <> rg.Value Then pic1.Delete 'Elimina las imágenes cuyos nombres de ubicación correspondientes no coinciden
End If Siguiente imagen.Copiar Sh.Select rg .Offset(ofsrow, ofscol).Seleccione ActiveSheet.Pegar con Selection.ShapeRange
.LockAspectRatio = msoFalse
.Left = rg.Offset(ofsrow , ofscol).Izquierda + rg. Desplazamiento(ofsrow, ofscol).Ancho / 20
.Top = rg.Offset(ofsrow, ofscol).Top
.Alto = rg. Offset(ofsrow, ofscol).Height
.Width = rg.Offset(ofsrow, ofscol).Width * 0.95 Terminar con rg.Select End If Next Application.CutCopyMode = False para cada pic1 en Sh.Shapes Si InStr(1, pic1.Name, "Drop Down") = 0 Entonces si pic1.TopLeftCell.Address = rg.Offset(ofsrow, ofscol).Address Y pic1.Name = rg.Value Y flagcf Entonces pic1.Delete 'Delete las imágenes correspondientes pero duplicadas si pic1.TopLeftCell.Address = rg.Offset(ofsrow, ofscol).Address Y pic1.Name <> rg.Value Entonces pic1.Delete 'Elimina la imagen cuya posición correspondiente no coincide con If pic1.TopLeftCell. Dirección = rg.Offset(ofsrow, ofscol). Dirección Y pic1.Name = rg.Value Y flagcf = False Entonces flagcf = Verdadero Fin si el siguiente flagcf = False
Siguiente
Fin If
Application .ScreenUpdating = True 'Abrir pantalla de actualización
Application.DisplayAlerts = True 'Abrir advertencias y mensajes
End Sub
Sublibro de trabajo privado_
SheetChange(ByVal Sh como objeto, ByVal Target como rango)
En caso de error, reanudar siguiente
Atenuar indicador como booleano, flag1 como booleano, p como forma, rg como rango, rg1 como rango
flag = True 'Marca si la ubicación correspondiente contiene imágenes coincidentes, el valor predeterminado no está incluido
flag1 = False 'Marca si la galería contiene imágenes coincidentes, el valor predeterminado no está incluido
Application.ScreenUpdating = False 'Desactivar actualización de pantalla
Application.DisplayAlerts = False 'Desactivar advertencias y mensajes
Para cada p en Sh.Shapes para cada rg en destino Si InStr( 1, p.Name, "Drop Down") = 0 Entonces si p.TopLeftCell.Address = rg.Offset(ofsrow, ofscol).Address Y p.Name = rg.Value Entonces flag = False End Si es siguiente
Siguiente
Para cada p en hojas("Galería").Formas para cada rg en destino Si InStr(1, p.Name, "Drop Down") = 0 Entonces, si p.Name = rg.Value, entonces flag1 = True End If Next
Siguiente
Para cada rg en Target If rg <> False Y flag Y flag1 Entonces 'Encontrar una coincidencia imagen en la galería y la posición correspondiente está fija. Si no hay una imagen correspondiente, inserte la imagen para cada p en Sh.Shapes para cada rg1 en Target
If InStr(1, p.Name, "Drop Abajo") = 0 Entonces
Si p.TopLeftCell.Address = rg1.Offset(ofsrow, ofscol).Address Entonces p.Delete
Fin si Siguiente Siguiente Hojas("Galería" ).Shapes(rg.Value).Copy Sh.Select rg.Offset(ofsrow, ofscol).Select ActiveSheet.Paste On Error GoTo err If rg.Validation.Type Then 'With Selection.ShapeRange
. LockAspectRatio = msoFalse
.Left = rg.Offset(ofsrow, ofscol).Left + rg.Offset(ofsrow, ofscol).Width / 4
.Top = rg.Offset( ofsrow, ofscol).Top p>
.Alto = rg.Offset(ofsrow, ofscol).Alto
.Ancho = rg.Offset(ofsrow, ofscol
).Width * 0.75 Terminar con Else
err: Con Selection.ShapeRange
.LockAspectRatio = msoFalse
.Left = rg.Offset(ofsrow, ofscol) .Left + rg.Offset(ofsrow, ofscol).Ancho / 20
.Top = rg.Offset(ofsrow, ofscol).Top
.Height = rg.Offset(ofsrow) , ofscol).Height
.Width = rg.Offset(ofsrow, ofscol).Width * 0.95 End With End If rg.Select End If
Siguiente
Application.CutCopyMode = False
Para cada p en Sh.Shapes para cada rg en Target Si InStr(1, p.Name, "Drop Down") = 0 Entonces si p.TopLeftCell.Address = rg .Offset(ofsrow, ofscol).Address And p.Name <> rg.Value Then p.Delete End If Next
Siguiente
Application.ScreenUpdating = True 'Abrir pantalla de actualización
Application.DisplayAlerts = True 'Abrir advertencias y mensajes
End Sub
5 Cuando se cambia el contenido de la celda o el contenido de la celda cambia debido al cálculo, la Actualización la imagen en la ubicación correspondiente, el efecto final es el siguiente: