2013-08-28 8 views
15

मैं कर रहा नीचे लाइनों का उपयोग कर एक कार्यपुस्तिका से दूसरे में VBA मॉड्यूल compy करना है और अगर वहाँ एक आसान तरीका है मैं नहीं जानता, लेकिन वे ठीक काम कर रहा है:एक कार्यपुस्तिका में एक शीट से वीबीए कोड कॉपी करें?

Set srcVba = srcWbk.VBProject 
Set srcModule = srcVba.VBComponents(moduleName) 

srcModule.Export (path) 'Export from source 
trgtVba.VBComponents.Remove VBComponent:=trgtVba.VBComponents.Item(moduleName) 'Remove from target 
trgtVba.VBComponents.Import (path) 'Import to target 

हालांकि अब मैं की जरूरत है एक शीट में वीबीए कोड की प्रतिलिपि बनाने के लिए, मॉड्यूल में नहीं। उपर्युक्त विधि उस परिदृश्य के लिए काम नहीं करती है।

एक वर्कबुक से दूसरे में एक शीट में वीबीए कोड की प्रतिलिपि बनाने के लिए मैं किस कोड का उपयोग कर सकता हूं?

+1

बस शीट की प्रतिलिपि बनाएँ। कोड इसके साथ आएगा। – RBarryYoung

+2

मैं शीट की प्रतिलिपि नहीं बनाना चाहता, मैं केवल वीबीए कोड की प्रतिलिपि बनाना चाहता हूं! – user1283776

+0

आमतौर पर एक शीट में कोड, * शीट में होना आवश्यक है, यह सिर्फ इस तरह लिखा है। (अन्यथा, कोड को शीट में पहली जगह क्यों डालें?) – RBarryYoung

उत्तर

27

आप VBComponent को हटा और पुनः आयात नहीं कर सकते, क्योंकि यह पूरी वर्कशीट को तार्किक रूप से हटा देगा। इसके बजाय आप CodeModule उपयोग करने के लिए घटक के भीतर पाठ हेरफेर करने के लिए है:

Dim src As CodeModule, dest As CodeModule 

Set src = ThisWorkbook.VBProject.VBComponents("Sheet1").CodeModule 
Set dest = Workbooks("Book3").VBProject.VBComponents("ThisWorkbook") _ 
    .CodeModule 

dest.DeleteLines 1, dest.CountOfLines 
dest.AddFromString src.Lines(1, src.CountOfLines) 
+1

यह बिल्कुल शानदार है! मैं वीबीए में आपके जैसे अच्छे कैसे बन सकता हूं? क्या आप मुझे अपनी पसंदीदा किताबें या स्रोत बता सकते हैं जिनसे आपने सबसे ज्यादा सीखा है? – user1283776

+8

ओह, यह सिर्फ उसी सटीक समस्या को हल करने की कोशिश कर बिखरे हुए काम के कुछ हफ्तों से आ रहा है। एकमात्र चीज जो मैं कर सकता था वो वीबीए एक्स्टेंसिबिलिटी ऑब्जेक्ट्स पर पोक और प्रोड था जब तक मुझे कुछ तरीकों से पता चला जो मुझे जरूरी चीज की तरह लग रहा था। – Chel

0

यह यह बहुत ही एक पोस्ट के साथ-साथ विभिन्न स्रोतों से एक संकलित कोड है। मेरा योगदान एक कोड है जो आपके सभी कोड वीबीई (शीट्स/यह कार्यपुस्तिका/उपयोगकर्ता प्रारूप/मॉड्यूल/कक्षाओं) से एक नई कार्यपुस्तिका में कॉपी करता है।

मैंने इसे बनाया, क्योंकि मेरे पास भ्रष्ट कार्यपुस्तिका है और कोड समेत सभी भ्रष्ट नहीं होने के लिए कोड बना रहा है। (इस भाग केवल कोड + संदर्भ ठीक हो):

'needs a reference to : Visual basic for Application Extensibility 5.3 , 
'or run this code : thisworkbook.VBProject.References.AddFromFile "C:\Program Files (x86)\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB" 
'from immediate window (ctrl+G) or create a small sub 

Option Explicit 

Sub CopyComponentsModules() 'copies sheets/Thisworkbook/Userforms/Modules/Classes to a new workbook 
Dim src As CodeModule, dest As CodeModule 
Dim i& 
Dim WB_Dest As Workbook 
'Dim sh As Worksheet 
Dim Comp As VBComponent 

'Set sh = ThisWorkbook.Sheets(1) 
'sh.Cells.Clear 

Set WB_Dest = Application.Workbooks.Add 
On Error Resume Next 'needed for testing if component already exists in destination WorkBook and for cross-references. 
For Each Comp In ThisWorkbook.VBProject.VBComponents 

      'i = i + 1 
      'sh.Cells(i, 1).Value = Comp.Name 

      'Set Source code module 
      Set src = Comp.CodeModule 'ThisWorkbook.VBProject.VBComponents("Sheet1").CodeModule 

      'test if destination component exists first 
      i = 0: i = Len(WB_Dest.VBProject.VBComponents(Comp.Name).Name) 
      If i <> 0 Then 'or: if err=0 then 
       Set dest =  WB_Dest.VBProject.VBComponents(Comp.Name).CodeModule 
      Else 'create component 
       With WB_Dest.VBProject.VBComponents.Add(Comp.Type) 
        .Name = Comp.Name 
        Set dest = .CodeModule 
       End With 
      End If 

      'copy module/Form/Sheet/Class 's code: 
      dest.DeleteLines 1, dest.CountOfLines 
      dest.AddFromString src.Lines(1, src.CountOfLines) 

Next Comp 

'Add references as well : 
Dim Ref As Reference 
For Each Ref In ThisWorkbook.VBProject.References 
    'Debug.Print Ref.Name 'Nom 
    WB_Dest.VBProject.References.AddFromFile Ref.FullPath 
    'Debug.Print Ref.FullPath 'Chemin complet 
    'Debug.Print Ref.Description 'Description de la référence 
    'Debug.Print Ref.IsBroken 'Indique si la référence est manquante 
    'Debug.Print Ref.Major & "." & Ref.Minor 'Version 
    'Debug.Print "---" 
Next Ref 

Err.Clear: On Error GoTo 0 

'WB_Dest.Activate 

Set Ref = Nothing 
Set src = Nothing 
Set dest = Nothing 
Set Comp = Nothing 
Set WB_Dest = Nothing 
End Sub 
1

यहाँ किसी और भूमि Chel के जवाब की VSTO बराबर के लिए खोज करते हैं, तो यहाँ यह है: नोट करने के लिए

void CopyMacros(Workbook src, Workbook dest) 
{ 
    var srcModule = src.VBProject.VBComponents.Item(1).CodeModule; 
    var destModule = dest.VBProject.VBComponents.Add(Microsoft.Vbe.Interop.vbext_ComponentType.vbext_ct_StdModule); 

    destModule.CodeModule.AddFromString(srcModule.Lines[1, srcModule.CountOfLines]); 
} 

चीजें:

  1. आपको यह सामान करने के लिए माइक्रोसॉफ्ट.वेबी.इंटरोप का संदर्भ जोड़ना होगा।
  2. मैं गंतव्य कार्यपुस्तिका में एक नया सामान्य मॉड्यूल जोड़ रहा हूं, इसलिए मुझे DeleteLines पर कॉल करने की आवश्यकता नहीं थी। YMMV।
+0

कोई भी ऐसा करने में देख रहा है। नेट आमतौर पर मेरे [वीबीए सिंक टूल] के लिए स्रोत कोड देख सकता है (https://github.com/chelh/VBASync) – Chel

संबंधित मुद्दे