Colección de citas famosas - Slogan de motivación - Excel VBA, el código del programa VBA cambia el contenido de la imagen

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)

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

.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: