excel - 传递函数变量

标签 excel vba function

我需要我的代码来返回随机字符串并且它什么都不返回。我已经包含了代码以使其更容易。我希望这有帮助。
一切都在运行,并且消息即将出现,但变量 dna1 和 dna2 为空。

Dim lengthDNA As Integer

Sub dna()
    Dim str As String, dna1 As String, dna2 As String
    Dim x As Long
    
    lengthDNA = InputBox("Enter the length of DNA sequences (10-250)")
    
    dna1 = RandInteger("ACGT")
    dna2 = RandInteger("ACGT")
    
    MsgBox ("DNA Sequence 1 is: " & dna1 & Chr(13) & "DNA Sequence 2 is: " & dna2), vbInformation
End Sub



Public Function RandInteger(strRandom As String) As String
    dnaBank = Array("A", "C", "G", "T")
    
    For x = 1 To lengthDNA
        Randomize
        strRandom = strRandom & dnaBank(Int((UBound(dnaBank) - LBound(dnaBank) + 1) * Rnd + LBound(dnaBank)))
    Next x
End Function

最佳答案

如果不需要,不要使用全局变量。尽可能将变量声明为本地变量,并尽可能接近它们的第一次使用。如果您需要将变量提交给另一个函数/子,请将其作为参数提交。
为变量和函数选择好的名称。 RandInteger例如非常困惑。您将函数命名为 Integer但它返回 String (文本)。而是给它一个有意义的名称,例如 CreateRandomDNA()并提交 Length你希望 DNA 作为参数。

Option Explicit

Public Sub dna()
    Dim lengthDNA As Long
    
    ' get DNA length from user input, allow user to press cancel
    Dim ReturnValue As Variant
    ReturnValue = Application.InputBox(Prompt:="Enter the length of DNA sequences (10-250)", Type:=1) 'Type:=1 Allow numbers only
    If VarType(ReturnValue) = vbBoolean And ReturnValue = False Then
        'user pressed cancel
        Exit Sub
    Else
        lengthDNA = ReturnValue
    End If
    
    Dim dna1 As String
    dna1 = CreateRandomDNA(lengthDNA)
    
    Dim dna2 As String
    dna2 = CreateRandomDNA(lengthDNA)
    
    MsgBox "DNA Sequence 1 is: " & dna1 & vbCrLf & "DNA Sequence 2 is: " & dna2, vbInformation
End Sub



Public Function CreateRandomDNA(ByVal Length As Long) As String
    Dim dnaBank As Variant
    dnaBank = Array("A", "C", "G", "T")
    
    Randomize
    
    Dim strRandom As String
    Dim x As Long
    For x = 1 To Length
        strRandom = strRandom & dnaBank(Int((UBound(dnaBank) - LBound(dnaBank) + 1) * Rnd + LBound(dnaBank)))
    Next x
    
    CreateRandomDNA = strRandom  ' return random string to function
End Function

如果您需要创建不同的字符串,例如 DNA、RNA、氨基酸(用于蛋白质),您也可以在一个函数中完成:
Option Explicit

Public Enum BioCodeType
    bctDNA
    bctRNA
    bctAminoAcidSingleLetter
    bctAminoAcidMultiLetter
End Enum

Public Sub dna()
    Dim sequenceLength As Long
    
    Dim ReturnValue As Variant
    ReturnValue = Application.InputBox(Prompt:="Enter the length of DNA sequences (10-250)", Type:=1) 'Type:=1 Allow numbers only
    If VarType(ReturnValue) = vbBoolean And ReturnValue = False Then
        'user pressed cancel
        Exit Sub
    Else
        sequenceLength = ReturnValue
    End If
    
    Dim dna As String
    dna = CreateRandomBioString(sequenceLength, bctDNA)
    
    Dim rna As String
    rna = CreateRandomBioString(sequenceLength, bctRNA)
    
    Dim aminoSingle As String
    aminoSingle = CreateRandomBioString(sequenceLength, bctAminoAcidSingleLetter)
    
    Dim aminoMulti As String
    aminoMulti = CreateRandomBioString(sequenceLength, bctAminoAcidMultiLetter)
    
    MsgBox "DNA Sequence is: " & dna & vbCrLf & _
           "RNA Sequence is: " & rna & vbCrLf & _
           "Amino Acid Sequence (single letter) is: " & aminoSingle & vbCrLf & _
           "Amino Acid Sequence (multi letter) is: " & aminoMulti & vbCrLf _
           , vbInformation
End Sub



Public Function CreateRandomBioString(ByVal Length As Long, ByVal BioCode As BioCodeType) As String
    Dim Bank As Variant
    Dim Seperator As String
    
    Select Case BioCode
        Case bctDNA
            Bank = Array("A", "C", "G", "T")
    
        Case bctRNA
            Bank = Array("A", "C", "G", "U")
            
        Case bctAminoAcidSingleLetter
            Bank = Array("A", "R", "N", "D", "C", "E", "Q", "G", "H", "I", "L", "K", "M", "F", "P", "S", "T", "W", "Y", "V")
    
        Case bctAminoAcidMultiLetter
            Bank = Array("ALA", "ARG", "ASN", "ASP", "CYS", "GLU", "GLN", "GLY", "HIS", "ILE", "LEU", "LYS", "MET", "PHE", "PRO", "SER", "THR", "TRP", "TYR", "VAL")
            Seperator = "-"
    End Select

    Dim bankSize as Long
    bankSize = UBound(Bank) - LBound(Bank) + 1

    Dim bankMin As Long
    bankMin = LBound(Bank)

    Randomize
    
    Dim strRandom As String
    Dim x As Long
    For x = 1 To Length
        strRandom = strRandom & IIf(strRandom <> vbNullString, Seperator, vbNullString) & Bank(Int(bankSize * Rnd + bankMin))
    Next x
    
    CreateRandomBioString = strRandom
End Function
它会返回类似的东西
enter image description here

关于excel - 传递函数变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72095104/

相关文章:

algorithm - 这个 SuperFashHash 实现是否计算字符串的正确 31 位散列?

ms-access - 如何高效地进行Access VBA + SQL开发?

C 函数语法,在参数列表之后声明的参数类型

ms-access - vba GoToRecord acGoTo 不工作

vba - Excel VBA 或 VSTO - 如何循环数据透视表上的字段?

python - 如何在python中调用另一个文件中的函数

c - memset() 对于数组和字符串如何工作

excel - excel中如何合并2个单元格

python - 如何将带有 JSON 字符串的 Pandas DataFrame 转换为有效的 JSON?

Excel 2013 模态 VBA 用户窗体在用户窗体可见时更改 Activeworkbook