【问题标题】:Excel vba select from cell contentsExcel vba 从单元格内容中选择
【发布时间】:2016-09-03 07:38:42
【问题描述】:

对于这里的巫师来说,这可能是一个非常基本的。

我正在尝试通过根据输入的信息计算它来格式化工作表中的特定单元格,并且我为该部分提供的代码工作正常。通过输入名称,我在另一个单元格中获得了单元格引用,例如 Y5。我正在尝试选择该值(单元格地址)作为定义的变量celref。然后在我要更新的工作表上,我希望celref 中的单元格接收分配的格式。我使用的代码是:

Sub confirm()
Dim NAM As String
Dim celref As String
Worksheets("Morning").Select
NAM = Range("C3").Value
celref = Range("D3").Value
answer = MsgBox("Confirm sign in for " + NAM, vbYesNo + vbQuestion, "Confirm  Sign In")
If answer = vbNo Then GoTo Bye

    Worksheets("details").Select
Range(celref).Select      '<========= This is where I get the error!
With Selection.Font
    .ThemeColor = xlThemeColorDark1
    .TintAndShade = 0
End With
With Selection.Interior
    .Pattern = xlSolid
    .PatternColorIndex = xlAutomatic
    .ThemeColor = xlThemeColorLight1
    .TintAndShade = 0
    .PatternTintAndShade = 0
End With
Selection.Font.Bold = True

之后还有一些代码,但似乎是导致问题的范围选择。请问我犯了什么新手错误?

【问题讨论】:

  • D3 中的值是多少?
  • 做一个Debug.Print Range("D3").Value 并报告它是什么。
  • D3 中的值是对这个公式的评估:=$M$1&MATCH(C3,kidnames,0)+4 当前给出结果'Y5',这是我要格式化的单元格“细节”
  • 是的,我确定我确实需要学习如何避免使用选择,但目前我最需要做的就是让这段代码正常工作:-)

标签: excel formatting vba


【解决方案1】:

如果您想以更好的形式实现这一点,请尝试以下操作:

Sub confirm()
    Dim morningWS, detailsWS As Worksheet
    Dim NAM, celref As String

    Set morningWS = ThisWorkbook.Sheets("Morning")
    Set detailsWS = ThisWorkbook.Sheets("details")
    celref = morningWS.Range("D3").Value
    NAM = morningWS.Range("C3").Value

    answer = MsgBox("Confirm sign in for " + NAM, vbYesNo + vbQuestion, "Confirm  Sign In")
    If answer = vbNo Then GoTo Bye

    With detailsWS.Range(celref)
        With .Font
            .ThemeColor = xlThemeColorDark1
            .TintAndShade = 0
            .Bold = True
        End With
        With .Interior
            .Pattern = xlSolid
            .PatternColorIndex = xlAutomatic
            .ThemeColor = xlThemeColorLight1
            .TintAndShade = 0
            .PatternTintAndShade = 0
        End With
    End With

这样可以清楚您引用的是哪些单元格,并且应该使您更容易编辑内容而不会遇到错误。

实现此目的的另一种方法:

Sub confirm()
    Dim morningWS, detailsWS As Worksheet
    Dim NAM As String
    Dim celref as Range

    Set morningWS = ThisWorkbook.Sheets("Morning")
    Set detailsWS = ThisWorkbook.Sheets("details")
    Set celref = detailsWS.Range(morningWS.Range("D3").Value) 'making celref a range object
    NAM = morningWS.Range("C3").Value

    answer = MsgBox("Confirm sign in for " + NAM, vbYesNo + vbQuestion, "Confirm  Sign In")
    If answer = vbNo Then GoTo Bye

    With celref 'celref is the object and doesnt need to be otherwise addressed
        'rest of the code

【讨论】:

  • 感谢您的建议,非常感谢。不幸的是,当它到达'Set celref'行时,我得到“运行时错误'424':需要对象
  • 您是否复制并粘贴了整个代码?喜欢我们Dim celref As Range的部分吗?
  • 嗨,是的,我毫不掩饰地复制/粘贴了整个内容: Sub confirm() Dim morningWS, detailsWS As Worksheet Dim NAM As String Dim celref As Range Set morningWS = ThisWorkbook.Sheets("Morning") Set detailsWS = ThisWorkbook.Sheets("details") NAM = morningWS.Range("C3").Value Set celref = MorningWS.Range("D3").Value ... 以此类推
  • @KeithT 这完全是我的错。事实证明我还有一两件事要了解 VBA。尝试新的更新代码,它对我有用。这就是我在不测试代码的情况下抛出代码的结果。
  • 我必须给你买一顶正式的巫师帽!这行得通,非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-25
  • 1970-01-01
相关资源
最近更新 更多