2016-07-01 6 views
2

Ich schreibe Code für einen Client, der Daten aus vielen unterschiedlich angelegten Dateien zieht. Ich wollte etwas schreiben, das für ihn in Zukunft ziemlich flexibel ist.Legen Sie einen Bereich mit einem String/Zelle Inhalt

Daher wird er in der Lage sein, zum Beispiel y.offset(0,1) in einer Zelle zu schreiben, wo in Bezug auf die Variable y die Daten sein werden.

Der Grund, warum ich nicht nur die die Variable 1 gemacht ist, weil es, und daher ist die Zelle, enthalten kann oder auch nicht mehrere & „bla bla“

Grundsätzlich bin ich frage mich, ob es möglich ist, zu schreibe Teile des Codes in eine Zelle, ziehe sie dann hoch und verbinde sie mit Code.

Zum Beispiel:

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 

Das funktioniert nicht, aber ich frage mich, ob es etwas gibt, das das gleiche Ergebnis getan werden kann, zu erhalten.

+0

Können Sie eine detailliertere Beschreibung geben, warum Sie das brauchen? In Ihrem Beispiel wäre es einfacher, einfach nach einer Zellreferenz in der A1- oder R1C1-Notation zu fragen. – arcadeprecinct

+0

Es gibt 'application.evaluate', das etwas wie 'OFFSET (Sheet1! G4, 0, 4)' verarbeiten kann, aber ich kenne keine Möglichkeit, eine Zeichenfolge als VBA-Operation zu verarbeiten. – Jeeped

+0

Sie könnten immer eine UDF mit Eingabe von einer Zelle erstellen. –

Antwort

1

Ihre Notwendigkeit ist ein bisschen eine rekursive und gefährlich

dann verdient es eine solche rekursive und gefährliche Antwort

Sie konnte das VBA-Projektobjektmodell (siehe here für weitere Informationen) und wie folgt vorgehen:

  1. Stellen Sie Ihr Projekt VBA-Objektmodell

    zu handhaben

    folgen alle Schritte, die Sie in der Einführung der oben angegebenen Link zu cpearson Website hinzufügen Bezug auf Ihr Projekt

    Haftungsausschluss sehen: Bitte lesen Sie auch die VORSICHT Notiz dort

  2. add „Helfer“ Modul

    Ihrem Projekt ein neues Modul hinzufügen und nennen es nach „HelperModule“ (man kann es nennen, wie Sie wollen, aber dann mit dem gewählten Namen übereinstimmen)

    dann diesen Code in das neue Modul hinzufügen

    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 
    
  3. Fügen Sie diesen Code auf Ihre Haupt-Code

    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' 
    
+0

Vielen Dank für die Antworten. Dieser Link war fantastisch und ich werde ihn definitiv buchen, um ihn für zukünftige Referenzen zu markieren (die Vorsicht im Hinterkopf behalten). –

+0

Sie sind willkommen. und wenn ich deine Frage erfüllt habe (ich habe es tatsächlich getestet, bevor ich antwortete und es funktionierte), dann bitte als akzeptiert markieren. Vielen Dank – user3598756

Verwandte Themen