精华内容
下载资源
问答
  • 大家好,我们今日继续讲解VBA代码解决方案的第122讲内容:如何在VBA中使用单元格Offset 属性。其实这讲的内容非常的简单,却是应很多的朋友要求来写的,很多人提出单元格的引用和定位问题。其实这个问题对于新手是很...

    aa3756d7566db58cbf6ac3805f835c81.png

    大家好,我们今日继续讲解VBA代码解决方案的第122讲内容:如何在VBA中使用单元格Offset 属性。其实这讲的内容非常的简单,却是应很多的朋友要求来写的,很多人提出单元格的引用和定位问题。其实这个问题对于新手是很困扰的,对于成手来说,单元格的定位也需要深入的理解。

    引用工作表单元格非常灵活的方法是使用Offset属性。当你在运行程序时,你也许不知道某个单元格的确切地址,或者不关心单元格的确切地址。你也不能通过具体的参数来选择一个你根本不知道地址的单元格。而我们关心的却是基于当前选择的活动单元格来判断新的位置,从而选择一个需要的单元格位置。这一点也就是Offset属性的强项。

    Offset属性是通过计算从开始选择的单元格向下或向上移动的具体行数,来得到新的区域的。同样也可以从当前选择的单元格区域向右或向左移动具体的列数。

    offset属性返回一个 Range 对象,它以某一个特定的单元格为起点移动到另一个单元格或者区域,根据指定的行数和列数进行偏移。

    Offset语法: Offset(RowOffset,ColumnOffset)

    说明:偏移行列的数字可以是正数,负数,零值,其中偏移行数为正数则向下,负数向上偏移,偏移列数为正数向右负数向左。0表示与起始单元格相同,没有指定参数值则默认为0。

    Offset属性使用两个自变量来获得新单元格区域的地址。第一个自变量表示行偏移,第二个自变量则表示列偏移。我们来测试一下几个例子:

    例① Range("A1").Offset(1, 3).Select 选择单元格A1下面一行和右边三列的单元格

    例② Range("D15").Offset(-2, -1).Select 选择单元格D15上面两行和左边一列的单元格

    af9678a8236a980ed8e061a8722a14bd.png

    通过立即窗口来验证一下我们的选择:

    cd8b4d0d13f03e5a724e61c4ab06c7bf.png

    上面的第一个例子里,Excel选择的时单元格D2。第二个例子,Excel选择了单元格C13。

    如果单元格A1和D15已经被选中了,你也可以将上面的两个例子中的具体单元格地址换成当前选中的单元格,改写为这样:

    Selection.Offset(1, 3).Select

    Selection.Offset(-2, -1).Select

    例③ ActiveCell.Offset(-1, 0).Select 返回结果是选择当前单元格上面一行的单元格(同列)

    第三个例子里的第二个自变量是0,第一个或第二个自变量为0时,Offset属性相应表示当前行或当前列。

    引申:如果当前活动单元格在第一行,那么指令ActiveCell.Offset(-1, 0).Select会 导致错误。如下:

    51a9cda6274c00abfcb6e3bf0d66176e.png

    今日内容回向:

    1 OFFSET 是什么呢?

    2 为什么要应用OFFSET呢?

    《VBA代码解决方案》终于可以和大家见面了,是我将一些非常实用的VBA内容结集成册,PDF文件,可以从中直接查找到你想要解决问题的思路和方法,可以复制文中的VBA代码直接使用。有需要的朋友微信联络我NZ9668。

    bd072e6af65e3ac7b33e2f827afb868a.png

    e018239248dfae7eaf2e703505dc4898.png

    cc559291f4a4c5ff48f0c785d01b12e5.png
    展开全文
  • 本篇文章说一个VBA常见应用案例,批量提取工作簿中特定位置数据。作为VBA入门的学习练手的案例非常合适。搞明白搞懂,汇总工作簿之类的问题都不在话下。→案例需求:首先,我有一堆待提取的表(每个表里分为加工总表...

    9b3386efdc5eecfbe1dfda559c3cd99e.png

    本篇文章说一个VBA常见应用案例,批量提取工作簿中特定位置数据。作为VBA入门的学习练手的案例非常合适。搞明白搞懂,汇总工作簿之类的问题都不在话下。

    →案例需求:

    首先,我有一堆待提取的表(每个表里分为加工总表和成本表):

    69a53ffce5acb380b5f7c2c5311e5140.png

    汇总表和分表的数据对应关系如下:

    加工总表:

    f8b14039aac2d6d792d8af0947638f14.png
    /双击查看大图

    成本表:

    aa54e4e0ef68585368f88fb48ddde62a.png
    /双击查看大图

    →思路分析:

    ①批量提取必定要循环打开工作簿,再找到相对应位置直接取数据。让代码代替手工去循环打开工作簿。这里我们用GetOpenFilename方法,允许使用者选择需要汇总的工作簿路径,获取之后,对GetOpenFilename方法返回的路径进行循环。具体用法可以看历史文章:获取文件全路径(一)GetOpenFilename方法

    ②有一个稍微难一些的地方,成本表中需要提取的数据行数位置不固定

    75bd97a5ebe649a5310de97887807795.png

    有的朋友可能想到用end属性,但是这里面有合并单元格,而且提取数据的周围上下都有数据,这些都是阻挡正确提取数据的地方。

    这个时候就要找另外一些突破点:发现需要提取的数据都是位于【总计】这个单元格的附近。这样的话,我们就可以用Find函数查找【总计】这个单元格所在的位置,找到了他,提取他周围的单元格内容就简单多了。Find函数具体用法,详见历史文章:不得不说的高效Boy:Find方法

    我觉得VBA入门的差别就在这了:会不会找规律,并将这些规律转化为代码的逻辑条件。

    →代码详解:

    Sub 汇总清空之前的数据()
        '//弹出窗口,让用户选择需要合并的工作簿
        pth = Application.GetOpenFilename("文件(*.xls*),*.xls*", , "请选择文件", , True) 'GetOpenFilename支持通配符,true代表允许多选。
        If Not IsArray(pth) Then '如果用户没有选择文件,则返回False,不是数组。
            MsgBox "请选择需要汇总的工作簿"
            Exit Sub '退出过程
        End If
        '//
        Application.ScreenUpdating = False '禁止刷新,防止屏幕闪烁,提高运行速度
        Application.AskToUpdateLinks = False '禁止提示更新链接
        Application.DisplayAlerts = False '禁止无关的提示信息
        Set thissht = ThisWorkbook.ActiveSheet '把代码工作簿的活动工作表赋值给对象变量thissht
        thissht.Range("a2:k10000").ClearContents '清空除标题行以外的原有数据
        For i = 1 To UBound(pth) 'GetOpenFilename多选文件的话返回的是一个数组,里面存放的是每个文件的路径,循环数组获取里面的文件路径。
            Set wb = Workbooks.Open(pth(i)) '将打开的工作簿赋值给对象变量wb
            Set sumsht = wb.Worksheets("加工总表") '将打开的工作簿的【加工总表】sheet赋值给对象变量sumsht
            Set chengbensht = wb.Worksheets("成本表") '将打开的工作簿的【成本表】sheet赋值给对象变量sumsht
            lastrow = thissht.Cells(thissht.Rows.Count, 1).End(3).Row + 1 '获取代码工作簿已使用的最大行号+1
            With thissht 'with结构,简化代码
                .Cells(lastrow, 1) = i '序号
                .Cells(lastrow, 2) = sumsht.Range("a4") '加工任务
                .Cells(lastrow, 3) = sumsht.Range("b4") '材料
                .Cells(lastrow, 4) = sumsht.Range("c4") '厚度
                .Cells(lastrow, 5) = sumsht.Range("e4") '加工时间
                .Cells(lastrow, 6) = sumsht.Range("f4") '零件总数
                Set zongji = chengbensht.UsedRange.Find("总计", , xlValues, xlWhole, xlByColumns, xlNext, True, True) 'find方法,查找【总计】关键字所在单元格
                .Cells(lastrow, 7) = chengbensht.Cells(zongji.Row, 5) '和【总计】单元格同一行,第5列的数据就是所需要的穿孔个数
                .Cells(lastrow, 8) = Replace(chengbensht.Cells(zongji.Row + 1, 5), "元/个", "") '在【总计】单元格下一行,第5列的数据就是所需要的单价
                .Cells(lastrow, 9) = chengbensht.Cells(zongji.Row, 6) '理解同上
                .Cells(lastrow, 10) = Replace(chengbensht.Cells(zongji.Row + 1, 6), "元/m", "") '理解同上
                .Cells(lastrow, 11) = Replace(chengbensht.Cells(zongji.Row + 2, 5), "元", "") '理解同上
                '上述几句可以用offset实现。
            End With
            wb.Close False '关闭打开的工作簿,直接用对象变量wb.clsoe即可。false表示不保存。
        Next
        Application.ScreenUpdating = True '开启刷新
        Application.AskToUpdateLinks = True '开启提示更新链接
        Application.DisplayAlerts = True '开启无关的提示信息
        MsgBox "完成!"
    End Sub
    

    上述查找到【总计】单元格的位置之后,还可以用offset方法找到周围的单元格,这个可以自己试着写一下。

    →写在最后:

    很多人说VBA怎么入门,迟迟不能入门,也有一些人迟迟摇摆不定到底学不学VBA,恐怕多刚学会VBA就被废弃了。

    ▪是否值得学我想说的是,担心太多余了,技多不压身,学习VBA给你带来的效率回报,可能是你自己都想不到的。VBA,用了都说好。

    ▪关于迟迟不能入门第一个是知识点的积累:比如文中说的Find方法,你没学过这个,根本想不到当行数不确定的时候怎么获取。所以,一定的知识点积累是必要的。百度、问人或者刷教程都可以。

    第二个是一定要敲代码:就算抄一遍也会有很多收获,因为你可能抄都抄不对。我刚开始入门的时候,自己写代码。表示单元格的Cells到底加不加s都会有疑问,Worksheets都拼不对。

    推荐阅读:(点击下方标题即可跳转)

    • 【建议收藏】VBA说历史文章汇总
    • 速码工具箱2.0发布,更强大的功能等你来体验!
    • VBA会被Python代替吗?
    • 代码存储美化工具测评-【VBE2019】
    • Excel和Word数据交互读取(生成合同)
    展开全文
  • 大家好,今日内容仍是和大家分享VBA编程中常用的简单“积木”过程代码,第NO.114-NO.115则,内容是:FindPrevious反向查找、利用LIKE查找等内容。 VBA过程代码114:利用FindPrevious完成查找Sub mynz()Set rng = ...

    87aaebb386e1a02fa7a71a10e5feda7d.png

    分享成果,随喜真能量。大家好,今日内容仍是和大家分享VBA编程中常用的简单“积木”过程代码,第NO.114-NO.115则,内容是:FindPrevious反向查找、利用LIKE查找等内容。

    408021731bb7669746f0f88e656597eb.png

    VBA过程代码114:利用FindPrevious完成查找

    Sub mynz()

    Set rng = Sheets("8").Range("B1:E1000").Find("*a*")

    If Not rng Is Nothing Then

    Msgbox “查找到了”

    Set rng = .Range("B1:E1000").FindPrevious(rng)

    If Not rng Is Nothing Then

    Msgbox “再次查找到了”

    END IF

    END IF

    END WITH

    END SUB

    代码的解析说明:执行上述代码后,将在工作表Sheets("8")的Range("B1:E1000")中查找含有a的单元格。加入查找到则返回提示“查找到了”,然后再次执行查找,再次查找时是向前执行查找:FindPrevious(rng)。

    d0122764206ac6dc96945b8b9b7fa1cb.png

    VBA过程代码115:利用LIKE查找

    Sub mynz()

    Dim rng As Range

    Dim a As Integer

    a = 1

    With Sheets("8")

    .Range("A:A").ClearContents

    For Each rng In .Range("B1:E20")

    If rng.Text Like "*a*" Then

    .Range("A" & a) = rng.Text

    a = a + 1

    End If

    Next

    End With

    End Sub

    代码的解析说明:执行上述代码后,将在工作表Sheets("8")的A列中查找含有a的单元格。

    rng.Text Like "*a*" 是用like进行判断。

    e66c592c2f53d3f9cd86c4d26a43e953.png

    越简单的事物往往越容易理解,简单的过程组合起来就是一个复杂的过程,我们要先认真掌握这些简单的过程,才能在可以为我们复杂的工程服务。

    下面是我根据自己20多年的VBA实际利用经验,编写的四部教程,这些是较大块的“积木”,可以独立的完成某些或者某类系统的过程,欢迎有需要的朋友联络(WeChat:NZ9668)分享。利用这些可以提高自己的编程效率。这些教程供有志于提高自己能力的朋友选择。

    第一套:《VBA代码解决方案》PDF教程,是VBA中各个知识点的讲解,覆盖了绝大多数的知识点,是初学及中级以下人员必备的资料。

    第二套:《VBA数据库解决方案》PDF教程。数据库是数据处理的利器,对于中级人员应该掌握这个内容了。

    第三套:《VBA数组与字典解决方案》PDF教程,讲解VBA的精华----字典,是我们打开思路,提高代码水平的必备资料。

    第四套:《VBA代码解决方案》视频教程。目前正在录制,现在推出“每天20分钟,半年精进VBA”活动,越早参与,回馈越多。现在第一册48讲内容已经录制完成。录制到第二册71讲的课程,第二级阶段的优惠期开始。

    展开全文
  • 大家好,今日内容仍是和大家分享VBA编程中常用的简单“积木”过程代码,第NO.111-NO.113则,内容是:利用FindNext完成多重查找、利用ClearContents完成清除值的操作、利用FIND完成模糊查找等内容。VBA过程代码111:...

    df2bfa03386967901c727a38ec509a96.png

    分享成果,随喜真能量。大家好,今日内容仍是和大家分享VBA编程中常用的简单“积木”过程代码,第NO.111-NO.113则,内容是:利用FindNext完成多重查找、利用ClearContents完成清除值的操作、利用FIND完成模糊查找等内容。

    VBA过程代码111:利用FindNext完成多重查找

    830622b7f367e2dfa7c786875495e162.png

    Sub mynz()

    Dim StrFind As String

    Dim Rng As Range

    Dim FindAddress As String

    StrFind = InputBox("请输入要查找的值:")

    If Trim(StrFind) <> "" Then

    With Sheets("7").Range("A:A")

    Set Rng = .Find(What:=StrFind, _

    After:=.Cells(.Cells.Count), _

    LookIn:=xlValues, _

    LookAt:=xlWhole, _

    SearchOrder:=xlByRows, _

    SearchDirection:=xlNext, _

    MatchCase:=False)

    If Not Rng Is Nothing Then

    FindAddress = Rng.Address

    Do

    Rng.Interior.ColorIndex = 6 '设置成黄色

    Set Rng = .FindNext(Rng)

    Loop While Not Rng Is Nothing And Rng.Address <> FindAddress

    End If

    End With

    End If

    End Sub

    代码的解析说明:执行上述代码后,将在工作表Sheets("7")的Range("A:A")即A列中查找用户输入的值,查找的类型是完全匹配,如果说查找到这个单元格后将执行Rng.Interior.ColorIndex = 6 即把单元格设置成黄色,其中Set Rng = .FindNext(Rng)是执行下一次查找,FindAddress = Rng.Address 是验证单元格的地址是否相同,Loop While Not Rng Is Nothing And Rng.Address <> FindAddress 是循环的条件。

    8c65ec8b60633e6fe15369b92aa25291.png

    VBA过程代码112:利用ClearContents完成清除值的操作

    Sub mynz()

    With Sheets("8")

    .Range("A:A").ClearContents

    END WITH

    END SUB

    代码的解析说明:执行上述代码后,将在工作表Sheets("8")的Range("A:A")即A列的值全部清除。但格式将保留。

    b457755762f3a44cc8a075ad91b5f731.png

    VBA过程代码113:利用FIND完成模糊查找

    Sub mynz()

    Set rng = Sheets("8").Range("B1:E20").Find("*a*")

    If Not rng Is Nothing Then

    Msgbox “查找到了”

    END IF

    END WITH

    END SUB

    代码的解析说明:执行上述代码后,将在工作表Sheets("8")的Range("B1:E20")中查找含有a的单元格。加入查找到则返回提示“查找到了”

    越简单的事物往往越容易理解,简单的过程组合起来就是一个复杂的过程,我们要先认真掌握这些简单的过程,才能在可以为我们复杂的工程服务。

    下面是我根据自己20多年的VBA实际利用经验,编写的四部教程,这些是较大块的“积木”,可以独立的完成某些或者某类系统的过程,欢迎有需要的朋友联络(WeChat:NZ9668)分享。利用这些可以提高自己的编程效率。这些教程供有志于提高自己能力的朋友选择。

    第一套:《VBA代码解决方案》PDF教程,是VBA中各个知识点的讲解,覆盖了绝大多数的知识点,是初学及中级以下人员必备的资料。

    第二套:《VBA数据库解决方案》PDF教程。数据库是数据处理的利器,对于中级人员应该掌握这个内容了。

    第三套:《VBA数组与字典解决方案》PDF教程,讲解VBA的精华----字典,是我们打开思路,提高代码水平的必备资料。

    第四套:《VBA代码解决方案》视频教程。目前正在录制,现在推出“每天20分钟,半年精进VBA”活动,越早参与,回馈越多。现在第一册48讲内容已经录制完成。录制到第二册71讲的课程,第二级阶段的优惠期开始。

    展开全文
  • 模板文档可免费获取送人玫瑰,手有余香,请将文章分享给更多朋友动手...在里面介绍了如何利用VBA的方法在大数据表格中快速定位单元格。若是你不记得了,请点击这里茫茫人海中,还是能一眼认出你今天要介绍的这一位小...
  • 学习Excel技术,关注微信公众号:excelperfect在VBA代码中,经常要引用单元格数据区域并对其进行操作。然而,如果对数据区域采用“硬编码”地址,那么当该区域大小变化时,必须修改相应的引用该区域的代码。本文整理...
  • range相关 ...range.address:返回各个对角顶点的绝对引用地址 Sub rangedemo() Dim r As Range Set r = Range("B3:D9") r.Select '让上面的单元格被选中 MsgBox r.Row & "行" & r.Column &...
  • VBA笔记

    千次阅读 2020-05-15 08:46:27
    $A$1 //绝对引用,复制公式时不改变单元格地址 A1 相对引用,复制公式时会改变引用单元格地址 IF(逻辑值,TRUE时的返回结果,FALSE时返回的结果) &在表中是连接符,连接表格的内容 VBA的数据类型 ...
  • Range(“b10”) = Range(“c2”).Value '返回单元格真实值 Range(“b11”) = Range(“c2”).Text ‘返回单元格看到的内容 Range(“c10”) = "’" & Range(“I3”).Formula '返回单元格中的公式 End Sub 40、 ...
  • VBA常用技巧

    2014-12-21 16:39:28
    技巧52 返回窗口的可视区域地址 12 第4章 Shape(图形)、Chart(图表)对象 12 技巧53 在工作表中添加图形 12 技巧54 导出工作表中的图片 12 技巧55 在工作表中添加艺术字 12 技巧56 遍历工作表中的图形 12 技巧57 ...
  • 学习Excel技术,关注微信公众号:excelperfectFunction过程能够让我们...让自定义函数返回指定类型的数组如下图1所示,在消息框中显示了工作表单元格地址及对应的值。图1这里,使用自定义函数PopulateArray来返回包...
  • VBA编程技巧大全

    2013-08-05 09:03:19
    技巧52 返回窗口的可视区域地址 126 第4章 Shape(图形)、Chart(图表)对象 128 技巧53 在工作表中添加图形 128 技巧54 导出工作表中的图片 133 技巧55 在工作表中添加艺术字 135 技巧56 遍历工作表中的图形 137 ...
  • Excel_VBA教程

    2014-09-22 11:36:34
    8.按地址和按值传递参数 97 9.使用可选的参数 97 10.定位内置函数 98 11.使用MSGBOX函数 99 12.MSGBOX函数的运行值 103 13.使用INPUTBOX函数 104 14.数据类型转变 105 15.使用INPUTBOX方法 106 16.使用主过程和子...
  • 04078获取单元格地址 04079获取单元格区域内的单元格数 04080获取单元格区域的行数 04081获取单元格区域的列数 04082获取单元格的行号 04083获取单元格的列号 04084获取单元格的列标字母 04085获取指定列号单元格的...
  • Excel VBA 基础教程

    2019-01-01 18:51:06
    目 录 一、VBA语言基础...................................................................................................................1 第一节 标识符....................................................
  • 'Application.Union 方法'返回两个或多个区域的合并区域'Sub test()Range("a1:b3,c5:d8").Select '文本地址引用方式Union([a1:b3], [c5:d8]).Select '单元格区域引用方式End Sub'小结:虽然range也可以完成多区域的...
  • Excel VBA程序设计.doc

    2009-07-06 22:16:12
    8.按地址和按值传递参数 104 9.使用可选的参数 105 10.定位内置函数 106 11.使用MsgBox函数 107 12.MsgBox函数的运行值 111 13.使用InputBox函数 111 14.数据类型转变 113 15.使用InputBox方法 114 16.使用主过程和...
  • ExcelVBA程序设计.doc

    2011-04-05 21:32:51
    8.按地址和按值传递参数 97 9.使用可选的参数 97 10.定位内置函数 98 11.使用MSGBOX函数 99 12.MSGBOX函数的运行值 103 13.使用INPUTBOX函数 104 14.数据类型转变 105 15.使用INPUTBOX方法 106 16.使用主过程和子...
  • Excel_VBA程序设计.pdf

    热门讨论 2009-08-31 23:05:20
    8.按地址和按值传递参数 104 9.使用可选的参数 105 10.定位内置函数 106 11.使用MsgBox函数 107 12.MsgBox函数的运行值 111 13.使用InputBox函数 111 14.数据类型转变 113 15.使用InputBox方法 114 16.使用主过程和...
  • range.column:可以得到range对象左上角单元格的列号3.range.address:该range各个对角顶点的绝对引用地址(带有$)特别注意:当range包含多个矩形区域时,row和column只返回其中某一个矩形的左上...
  • 50.对多个用同一分隔符分隔的待查找元素,逐一在表区域首列内搜索,将返回选定单元格的值相加,相当于多个vlookup函数相加,对于查找不到的元素在批注中添加,以提醒用户。 51.根据个人所得税(工资)反算工资数 52....
  • 函数作用:对多个用同一分隔符分隔的待查找元素,逐一在表区域首列内搜索,将返回选定单元格的值相加,............72 '51.函数作用:根据个人所得税(工资)反算工资数.........73 '52.函数作用:判断表是否存在.........
  • 1 与range对象位置有关的属性 (1)range.row : 该Range左上角单元格的行号 ...注意:当range包含多个矩形区域的时候,row和column只返回其中某一个矩形的左上角位置,并不一定是整个range的左上角! 比如:rang...
  • EXCEL编程VBA高级教程

    2015-04-16 11:40:55
    一、VBA语言基础...................................................................................................................1 第一节标识符...........................................................
  • 8.按地址和按值传递参数 92 9.使用可选的参数 93 10.定位内置函数 94 11.使用MsgBox函数 95 12.MsgBox函数的运行值 98 13.使用InputBox函数 99 14.数据类型转变 100 15.使用InputBox方法 101 16.使用主过程和子过程 ...
  • 相关知识点 Range对象位置的有关属性: ...注意:当Range包 含多个矩形区域时,row和column只返回其中一个矩形区域左上角的位置,并不是整个Range的左上角,比如Range(“D3:E4,A1,B1”)返回的可能是第3行第4列...
  • 下面简单介绍一下,TEXT 格式化公式 比如:TEXT("10","0000") 返回结果:“0010”INDIRECT 取得设置的行列地址 比如:INDIRECT("r"&5&"c"&2,0)就是取得5行2列单元格的值ADDRESS(2,2,4) 取得单元格地址 返回结果:...
  • 一个参数,输入工作表地址返回工作表名,建立的工作表将带的链接功能。 函数名称:数字 函数功能与参数:与“大写”函数相反,将大写字符转换为阿拉伯数字。 函数名称:分割取数 函数功能与参数:按分割符取数...
  • excel链接mysql

    千次阅读 2017-10-22 23:56:47
    打开一个数据库连接去运行SQLStr里的语句, 等返回数据将之放到一个数组变量里面去,最后用一个循环将数据从数组放到excel的单元格里面去。参见知乎-吴棋仁回答 Sub connect() Dim Password As String Dim SQL

空空如也

空空如也

1 2 3
收藏数 42
精华内容 16
关键字:

vba返回单元格地址