使用字符串/单元格内容设置范围

时间:2016-07-01 06:26:26

标签: excel vba

我正在为客户端编写一些代码,这些代码从许多不同布局的文件中提取数据。我想写一些对他来说非常灵活的东西。

因此,他将能够在单元格中编写例如y.offset(0,1),具体取决于数据的变量y

我还没有做出变量1的原因是因为它,因此单元格可能包含也可能不包含多个& " blah blah"

基本上,我想知道是否可以在单元格中编写部分代码然后将它们拉出来并将它们合并到代码中。

例如:

Dim y as range
Dim x as range
Dim c as string

Set Y = Sheet1.range("G4")
c = sheet1.range("A1")     [which contains the words y.offset(0,4)
Set x = c

这不起作用,但是我想知道是否可以采取任何措施来获得相同的结果。

1 个答案:

答案 0 :(得分:1)

你需要的是一种递归和危险的

然后它应该得到这样一个递归和危险的答案

您可以使用VBA项目对象模型(请参阅here获取信息)并执行以下操作:

  1. 将项目设置为处理VBA对象模型

    按照上面给出的链接简介中的所有步骤进行cpearson网站添加对项目的引用

    免责声明:另请阅读

  2. 中的注意备注
  3. 添加“帮助”模块

    在项目中添加一个新模块并在“HelperModule”之后调用它(您可以根据需要调用它,但随后与所选名称保持一致)

    然后将此代码添加到此新模块

    Function GetRange(refRng As Range) As Range
       Set GetRange = refRng 
    End Function
    
    
    Function SetToCellContent(refRng As Range, cellContent As String) As Range
        UpdateCodeModule cellContent
        Set SetToCellContent = HelpModule.GetRange(refRng)
    End Function
    
    Sub UpdateCodeModule(cellContent As String)
        Dim CodeMod As VBIDE.CodeModule
        Dim LineNum As Long
    
        Set CodeMod = ActiveWorkbook.VBProject.VBComponents("HelperModule").CodeModule
        LineNum = SearchCodeModuleLine(CodeMod, "Set GetRange")
        CodeMod.ReplaceLine LineNum, "    Set GetRange = " & cellContent
    End Sub
    
    Function SearchCodeModuleLine(CodeMod As VBIDE.CodeModule, FindWhat As String) As Long
        Dim SL As Long ' start line
        Dim SC As Long ' start column
        Dim EL As Long ' end line
        Dim EC As Long ' end column
        Dim Found As Boolean
    
        With CodeMod
            SL = 1
            EL = .CountOfLines
            SC = 1
            EC = 255
            Found = .Find(Target:=FindWhat, StartLine:=SL, StartColumn:=SC, EndLine:=EL, EndColumn:=EC, wholeword:=True, MatchCase:=False, patternsearch:=False)
        End With
    
        SearchCodeModuleLine = SL
    End Function
    
  4. 将此代码添加到主代码

    Set x = SetToCellContent(y, c) '<--| call the function that will take care of updating code in 'GetRange()' function and returns a range relative to 'y' as per the "code" in 'c'