【问题标题】:VBA public string not savingVBA公共字符串不保存
【发布时间】:2017-04-12 19:34:54
【问题描述】:

我正在尝试在两个单独的函数中使用公共变量自动保存文件,但由于某种原因,我的公共变量似乎没有保存。

ImportGammaData() 中为我的公共变量gammaSheet 分配一个值后,该函数可以正确分配Sheets(wkbkSheet).Name = gammaSheet

MsgBox(gammaSheet) 也会显示正确的字符串。

不幸的是,当我尝试在SaveAs() 中使用gammaSheet 时,它没有任何价值。

MsgBox(gammaSheet) 完全不显示任何内容。

发生了什么事?

Public gammaSheet As String
Public radionuclide As String
Public radioligand As String
Public studyCond As String
Public studyDate As String
Public folderName As String
Public studyName As String
Public gammaFile As Excel.Workbook
____________________________________________________ 
Sub ImportGammaData()

Dim wkbkSheet As String
wkbkSheet = ThisWorkbook.Sheets(6).Name
ThisWorkbook.Sheets(wkbkSheet).Range("A1:L105").Value = ""
ThisWorkbook.Sheets(wkbkSheet).Range("A1:L105").Interior.ColorIndex = 0

Dim gammaFileName As String

Dim starting_file_directory As String
starting_file_directory = Range("E3").Text
ChDrive starting_file_directory
gammaFileName = Application.GetOpenFilename(, , "Gamma counter file for study sheet")

Set gammaFile = Workbooks.Open(gammaFileName)

With ActiveWorkbook

gammaSheet = ActiveSheet.Name

Range("A1").TextToColumns Destination:=Range("A1"), DataType:=xlFixedWidth, _
    FieldInfo:=Array(Array(0, 1), Array(17, 1), Array(41, 1)), TrailingMinusNumbers _
    :=True

Range("A3:A8").TextToColumns Destination:=Range("A3"), DataType:=xlFixedWidth, _
    FieldInfo:=Array(Array(0, 1), Array(20, 1), Array(31, 1)), TrailingMinusNumbers _
    :=True

Range("A10").Select
Range(Selection, Selection.End(xlDown)).TextToColumns Destination:=Range("A10"), DataType:=xlFixedWidth, _
    FieldInfo:=Array(Array(0, 1), Array(6, 1), Array(11, 1), Array(17, 1), Array(23, 1), _
    Array(32, 1), Array(42, 1), Array(51, 1), Array(61, 1)), TrailingMinusNumbers:=True

ThisWorkbook.Sheets(wkbkSheet).Range("A1:I105").Value = gammaFile.Sheets(gammaSheet).Range("A1:I105").Value

End With

gammaFile.Close savechanges:=False

Sheets(wkbkSheet).Name = gammaSheet

Sheets(gammaSheet).Range("A10:I10").Font.Bold = True
Sheets(gammaSheet).Range("J10") = "Sample ID"
Sheets(gammaSheet).Range("J11") = "Cs-137"
Sheets(gammaSheet).Range("J12") = "Ge"
Sheets(gammaSheet).Range("J13") = "Background"
Sheets(gammaSheet).Range("K10") = "Volume (µL)"
Sheets(gammaSheet).Range("L10") = "ACN (µL)"

Sheets(1).Range("A16").Value = gammaSheet

Sheets("Decay Correction").Range("C2").Value = Sheets(gammaSheet).Range("C1").Value

If Sheets(gammaSheet).Range("B6").Value = "C-11" Then
    Sheets("Decay Correction").Range("B3").Value = "t(1/2) of C-11"
    Sheets("Decay Correction").Range("C3").Value = "20.385"
End If

If Sheets(gammaSheet).Range("B6").Value = "F-18" Then
    Sheets("Decay Correction").Range("B3").Value = "t(1/2) of F-18"
    Sheets("Decay Correction").Range("C3").Value = "109.77"
End If

Sheets(1).Range("B6").Value = "GAMMA COUNTER FILE IMPORTED!"
ThisWorkbook.Sheets(1).Range("B6").Interior.ColorIndex = 50

radionuclide = "[" + Sheets(gammaSheet).Range("B6").Value + "]"

End Sub
____________________________________________________ 
Sub SaveAs()
Sheets("Initial").Select
folderName = Range("A20").Value
studyName = Range("A16").Value + " " + Range("B16").Value + " " + Range("C16").Value + " " + Range("D16").Value + " " + CStr(Range("E16").Value) + " " + Range("F16").Value

'Dim strPath As String
'strPath = "C:\Users\tyeg\Documents\Gamma Counter Processing" & folderName
'Dim elm As Variant
'Dim strCheckPath As String
'
'strCheckPath = ""
'For Each elm In split(strPath, "\")
'    strCheckPath = strCheckPath & elm & "\"
'    If Len(Dir(strCheckPath, vbDirectory)) = 0 Then MkDir strCheckPath
'Next

ThisWorkbook.SaveAs Filename:= _
    "C:\Users\tyeg\Documents\Gamma Counter Processing\" + folderName + "\" + studyName + ".xlsm"

MsgBox (gammaSheet)

gammaFile.SaveAs Filename:= _
    "C:\Users\tyeg\Documents\Gamma Counter Processing\" + folderName + "\" + gammaSheet + ".T"

End Sub

【问题讨论】:

  • 在调用 ImportGammaDataSaveAs 之间,有些东西正在重置您的全局值。 VBProject 正在重置(清除所有全局变量)或其他一些代码正在主动清除 gammaSheet 的值
  • 这段代码是在哪里(在哪个模块中)编写的,谁在调用它,以及在任何地方做任何事情都使用End 指令?
  • 我想你删除了分配gammaFileName的指令?因为否则Set gammaFile 指令将失败。您是否在发布之前“清理”了您的代码?例如删除了On Error Resume Next 指令?
  • 你的代码还能编译吗?在With ActiveWorkbook 之后没有End With,无论如何您实际上并没有使用With ActiveWorkbook 的任何成员
  • @ThunderFrame 我认为 OP 试图“清理”他们的发布代码,并无意中删除了问题的关键。 并且使代码无法编译。

标签: excel vba global-variables


【解决方案1】:

gammaSheet 设为全局变量。全局变量在执行后保持其值。在这种情况下,取ImportGammaData()中的值后,再从SaveAs()中调用gammaSheet的值就没有问题了。

改变这个:

    Public gamaSheet As String

到这里:

    Global gamaSheet As String

【讨论】:

  • Global 已弃用,它与Public 的作用完全相同,除了Public 也可以在类模块中使用。因此 OP 的变量已经是全局的,而且这段代码完全没有任何改变。
  • 虽然已弃用,但“全球”仍然有效。我以前也遇到过这种问题,我就是这样解决的。
  • 关键是它与Public 在任何地方都是有效的相同。因此,无论您认为解决了什么问题,Global 都无法自行解决。继续,尝试重现该问题并通过将Public 替换为Global 来修复它。在您的答案中包含repro,我很乐意删除我的反对票。否则,这个答案是在传播错误信息并依赖魔法。顺便说一句,OP 的变量是 gammaSheet,而不是 gamaSheet
  • 嘿维克多,我很感激你尝试提供帮助,即使它没有工作!对不起,你被否决了这么多:(
猜你喜欢
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-26
  • 2010-11-04
  • 2011-02-15
  • 1970-01-01
相关资源
最近更新 更多