我已经设法与screengrabbing和复制到excel。不幸的是,它看起来像下面的链接中提出的解决方案;
Using Excel VBA Macro To Capture + Save Screenshot of Specific Area In Same File
对我来说还不够
我想把图像裁剪到屏幕的指定区域。
我的代码看起来像这样:
Sub Screengrab()
Application.SendKeys "({1068})", True
DoEvents
ActiveSheet.Paste Destination:=ActiveSheet.Range("B3")
Dim shp As Shape
Dim h As Single, w As Single
With ActiveSheet
Set shp = .Shapes(.Shapes.Count)
End With
h = -(675 - shp.Height)
w = -(705 - shp.Width)
'shp.Height = 2100
'shp.Width = 2400
shp.LockAspectRatio = False
shp.PictureFormat.CropRight = w
shp.PictureFormat.CropTop = h
'shp.PictureFormat.offset (-5)
End Sub
现在的情况是这样的。
从上面的代码我得到的图像在正确的位置,但因为它已被裁剪,我得到了截图的最左边的部分,其中包括工具栏,我不想要的。
我想有这个裁剪区域向右拉,这将包括工作页,而不是侧边栏。
如果我将代码更改为shp.PictureFormat.CropLeft = w
,我将得到桌面的相反部分,这很好。我不能抱怨,但它没有出现在我的打印区域,但很远。
我也尝试了使截图更小,虽然这太棘手了,因为作物不匹配指定的区域。
有没有什么方法可以适当地抵消它?
我试图复制代码参数并从两侧进行裁剪,但它不起作用,因为图像立即消失了:
Dim shp As Shape
Dim h As Single, w As Single ' l As Single, r As Single
With ActiveSheet
Set shp = .Shapes(.Shapes.Count)
End With
h = -(675 - shp.Height)
w = -(705 - shp.Width)
'l = -(500 - shp.Height)
'r = -(500 - shp.Width)
'shp.Height = 2100
'shp.Width = 2400
shp.LockAspectRatio = False
shp.PictureFormat.CropLeft = w
'shp.PictureFormat.CropLeft = r
shp.PictureFormat.CropBottom = h
'shp.PictureFormat.CropTop = l
End Sub
偏移量选项不起作用,因为此处不支持:'shp.PictureFormat.offset (-5)
以及:
shp.Range("B3").PasteSpecial
有没有办法从指定的区域进行截图,并将其偏移到工作表中我的区域?
1条答案
按热度按时间pxiryf3j1#
看起来我已经解决了这个问题。
首先,为了将我们的作物放置在所需的列中,我们必须使用VBA
.Top
和.Left
位置,基本上相当于"moving objects" in VBA Excel。接下来,如果我们想从反面裁剪图像,我们需要其他变量(我已经在前面的代码中列出了这些变量,但将其关闭)。值得一提的是,如果你输入的值不正确,那么你裁剪的图像几乎会消失--细条会出现在文档的某个地方。基本上,这些变量及其值的顺序很重要。例如,如果2个屏幕的完整屏幕截图计数为3840 x 1080 px,则
.CropLeft
将关闭最左侧的像素范围,即Cropleft 1225将消除从左侧开始计数的1225像素。另一方面,.Cropright
必须具有大于1225的值。例如,如果这个.Cropright
将计数1500,则1500和3840之间的像素将被移除。类似地,它适用于.CroopTop
和.Cropbottom.
此外,我们可以始终使用
.Width
和.Height
变量,以使裁剪的屏幕截图适合我们的工作表范围。最后一个是.LockAspectRatio = False
,我宁愿不更改为True
,因为它可能会导致不需要的区域从我们的屏幕上裁剪。而不是它,我会建议管理与纵横比手动,使用即this simple tool。最后,我整理了代码,将所有变量分组到
With
语句中,这样看起来更整洁。