I have a spreadsheet with a picture. I don't know the size of the picture (it may vary).
I want to to get the last row of the picture in a variable (I want to leave a blank row to the bottom of the picture and start filling data in the next row). Could you help me figure out the syntax?
I can't even figure out how to get the picture into a variable..
I was able to do this with the following code:
Dim testPic As Object
For Each testPic In ActiveSheet.Pictures
h = testPic.Height
cellHeight = Cells(ImageTopRow, ImageLeftCol).Height
nRows = h/cellHeight
Next
But:
a. I don't need a foreach, there's only one picture in the collection, I just can't figure out how to get the first one.
b. There should be an easier way, right?
Thanks,
Li
Dim pic As Shape
Set pic = ActiveSheet.Shapes(1)
MsgBox pic.BottomRightCell.Row
will show you the cell's location of the right bottom corner, ie
Hope this will help.
"ActiveSheet.Shapes.Count " - this helps you count the number of pictures in the active sheet
"ActiveSheet.Shapes(1)" - you can just use this if you only have 1 Photo or if you want the bottom right of the 1st photo
Code:
click to view the code Dim pic As Shape
Set pic = ActiveSheet.Shapes(ActiveSheet.Shapes.Count)
'Determines the address on the bottom right of the picture
lLast = pic.BottomRightCell.Address
'Selects the Bottom right cell of the Image/picture
Range(lLast).Select
Related
I'm totally new to this. I want to create a macro that add to my document the file path (at the time when the macro runs) into a text box that goes at the end of the document. I use Word 2016 for Mac.
I've found code on other threads that helped me to understand how to create the text box and work on its position in the document but I'm not able to add the file path code.
This is what I came up with so far:
Sub percorsofile2()
Dim Box As Shape
Set Box = ActiveDocument.Shapes.AddTextbox( _
Orientation:=msoTextOrientationHorizontal, _
Left:=50, Top:=50, Width:=100, Height:=15)
Box.TextFrame.TextRange: Selection.Fields.Add Range:=Selection.Range,
Type:=wdFieldEmpty, Text:="FILENAME \p "
You're very close! Just one little change...
The Selection is not in the TextBox, which is why the field code is not getting inserted in the right place. While you could first select the TextBox range, it's usually better to work directly with a Range object, rather than a selection.
My sample code declares a Range object, then sets it to the Box.TextFrame.TextRange. The field code can then be inserted at this position.
Sub percorsofile2()
Dim Box As Shape
Dim rng As Word.Range
Set Box = ActiveDocument.shapes.AddTextbox( _
Orientation:=msoTextOrientationHorizontal, _
Left:=50, Top:=50, width:=100, height:=15)
Set rng = Box.TextFrame.TextRange
rng.Fields.Add Range:=rng, Type:=wdFieldEmpty, Text:="FILENAME \p "
End Sub
I am looking for a way to insert a picture from a folder into a specific cell in excel. The folder contains hundreds of pictures. I am not familiar with excel macros or VBA. The way the code should work is I type the picture name into a cell and the result should extract a picture with the same name from that folder and place it into another cell. The picture being inserted should also be resized. If someone could please give me some guidance as to how this could be done. Thanks. I am sorry for my poor English as it is my second language.
Assuming you are typing your image name as "myImage.jpg" into cell A1 of your worksheet. Make sure it is the full name with the extension. Place this into your worksheet code.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim imagePath, fullImagePath, newImageLoc As String
imagePath = "C:\YourFileLocationPath\" 'set this to where your images are located.
If Target.Address = "$A$1" Then 'Assumming the cell you are entering your image is in A1 or change to whatever cell you want entering in.
fullImagePath = imagePath & Target.Value
newImageLoc = Target.Offset(, 2).Address ' this moves the new image location to the cell you enter your image name two columns to the right.
'Adjusts image size, change as needed
With ActiveSheet.Pictures.Insert(fullImagePath)
With .ShapeRange
.LockAspectRatio = msoTrue
.Width = 75
.Height = 100
End With
.Left = ActiveSheet.Range(newImageLoc).Left
.Top = ActiveSheet.Range(newImageLoc).Top
.Placement = 1
.PrintObject = True
End With
End
End If
End Sub
I'm looking to have my excel sheet with a split in it (vertically) ensuring a set of controls stay on the left of the screen for easy access. Currently Im using this code to select and move to a cell, based on a list of headings I have in the A column.
Option Explicit
Dim trimProcess() As String
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim i As Integer
If Not Intersect(ActiveCell, Range("A6:A1000")) Is Nothing Then
If ActiveCell.Value <> "" Then
For i = 0 To UBound(trimProcess)
If ActiveCell.Value = trimProcess(i) Then
Cells(4, 4 * (i + 1)).Select
Cells(4, 4 * (i + 1)).Activate
End If
Next
End If
End If
End Sub
This works fine for what I need, but it only works in the active split view IE if I click a cell in A in the left split, it moves the left split view. I want it so that the changes only the right view, but cant find the code to do so. Is this possible?
On a form I have 4 MSFlexGrids.
The top grid contains dynamic data, which updates once in a while.
The user can enter data in the cells of the 3 other grids.
The data which is used to fill the top grid is received via a Winsock control, processed, and then the results are written into the appropriate cells using .TextMatrix(intRow, intCol) = strData
This works fine. The data is updated flawlessly, and the user can enter his data into the other 3 grids without any problems.
The problem occurs when I want to change the background color of some cells in the top grid.
On rare occasions the received data is very important, and the background color of the corresponding cells should change color.
I change the color of the cells with the following code:
With grd
For lngRow = 1 To .Rows - 1
'default background color
lngBack = vbWhite
'check for important values
If Val(.TextMatrix(lngRow, 1)) >= lngMax Then
'important color
lngBack = &H3040FF
End If
'select whole row
.Row = lngRow
.Col = 0
.RowSel = lngRow
.ColSel = .Cols - 1
'set the background color of the selected row
.CellBackColor = lngBack
Next lngRow
End With 'grd
The problem with this is that when the user is entering data in the other 3 grids, and the background color of a row in the top grid is changed, then the focus moves to the top grid, and the user has to enter his data anew in the grid where he was working.
Is it possible to change the background color of a cell or whole row in a MSFlexGrid without moving the focus to that grid?
So far I could not find a solution to the problem itself.
I created a work around though :
I created an enum containing a value for each grid:
Public Enum ActiveGrid
enuSystem = 0
enuTel = 1
enuRLN = 2
enuRood = 3
enuData = 4
enuCircuit = 5
End Enum
Whenever a grid gets the focus I save the corresponding enum value in a form level variable.
After coloring the required cells in the first grid I return the focus to the grid which last had it.
The user is not editing in the grid itself, but in a textbox which is laid over the cell, so there is no real problem with the grid losing the focus.
When you look closely though you see the focus leave and return quickly.
For now I will accept this work around, and its minor glitches.
Maybe in the future I can come up with a better solution, or anyone else has a better suggestion?
I have a Visual Studio application with a splash screen image cut into "slices". The positions are specified in the Form Designer so they line up properly on the screen. However, the images are out of place when the application is run on the Chinese version of Windows XP. It looks as if the image slices were "exploded" apart.
What's going on here? Do international versions of Windows have a different meaning of the "top left" coordinate of the picture? How can I force the images to be precisely displayed where I want them?
We found a solution! Apparently the picture boxes stretched out on the Chinese XP PC, but the images they contained did not. The fix was to add code like the following:
Me.PictureBoxIcon.Width = Me.PictureBoxIcon.Image.Width
Me.PictureBoxIcon.Height = Me.PictureBoxIcon.Image.Height
Dim loc As New Point
loc.X = Me.PictureBoxIcon.Location.X
loc.Y = Me.PictureBoxIcon.Location.Y + Me.PictureBoxIcon.Height
Me.PictureBoxAbout.Location = loc
Me.PictureBoxAbout.Width = Me.PictureBoxAbout.Image.Width
Me.PictureBoxAbout.Height = Me.PictureBoxAbout.Image.Height
Hope this helps someone else!
In the OnLoad event of the form, you could always explicitly set the location of each section. If starting at the top left with the first and assuming an array with the images in order:
images[0].Location = new Point(0,0);
for (int i = 1; i < images.Length; i++)
{
images[i].Location = new Point(images[i - 1].Location.X + images[i - 1].Width, 0);
}
That will set the first image to the top left corner and all subsequent images to just after the last image.