/ / १) कॉलम २ की पहचान करें) कॉलम में मान की पहचान करें ३) उस पंक्ति से डेटा को सरणी में डालें - एक्सेल, वीबीए, एक्सेल-वीबीए

1) कॉलम 2 की पहचान करें) कॉलम 3 में मान की पहचान करें) उस पंक्ति से डेटा डालें - एसेल, वीबीए, एक्सेल-वीबीए

मैं क्षैतिज डेटा इकट्ठा करने की कोशिश कर रहा हूं (बाएंदाईं ओर) सेल I10 में शुरुआत - मैं सबसे पहले कॉलम I में सही खाता बही की पहचान करने के लिए मैक्रो को कोड करने का प्रयास कर रहा हूं। कॉलम I नीचे है I:10 जो कॉलम मैं चाहता हूं उसे प्रस्तुत करता हूं, Dividend Income

Ledger Account
Prior Shares Outstanding
Current Shares Outstanding
Current Share Activity
Previous Net Assets
Current Net Assets
Net Asset Change
Market Value
Trading Gain Loss
Dividend Income

मेरे पास नीचे दिया गया कोड है, मैं कोशिकाओं में डेटा को I10 (I:10 से Z:10) के दाईं ओर एक सरणी में सम्मिलित करने का प्रयास कर रहा हूं।

Sub Sample()
Dim ws As Worksheet
Dim MyAr As Variant
Dim SearchString As String
Dim aCell As Range
Dim i As Long

SearchString = "Ledger Account"

"~~> Change this as applicable
Set ws = ThisWorkbook.Sheets(1)

With ws
Set aCell = .Columns(1).Find(What:=SearchString, LookIn:=xlValues, _
LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)

If Not aCell Is Nothing Then
"~~> 5 Denotes the 5th column i.e Column "E"
"~~> Amend as applicable
"~~> Store the values From say Col B to E in the array
MyAr = Application.Transpose( _
.Range(.Cells(aCell.Row, 2), _
.Cells(aCell.Row, 5) _
).Value _
)

"~~> Check what is in the array
For i = LBound(MyAr) To UBound(MyAr)
Debug.Print MyAr(i, 1)
Next i
End If
End With
End Sub

उत्तर:

उत्तर № 1 के लिए 1

मुझे आपका प्रश्न भ्रमित करने वाला लगता है।

उदाहरण 1: क्या है I:10 to Z:10? क्या मतलब है आपका I10 to Z10 या I10:Z10? एक श्रेणी को परिभाषित करने के लिए कोलन दो एकल कक्ष पतों के बीच जाता है।

उदाहरण २: पाठ का अर्थ है कि खाता नामों की सूची कॉलम I (= ९) में है, लेकिन आपका कोड कॉलम १ (= ए) खोजता है।

इस उत्तर में मैं आपको वह जानकारी देता हूं जो मुझे आशा है कि आपको सही दिशा में इंगित करेगा।


विचार करें: Set ws = ThisWorkbook.Sheets(1).

उपयोगकर्ता के पास कई कार्यपुस्तिकाएँ खुली हो सकती हैं। आइए हम ए, बी, सी और डी को कॉल करें। उपयोगकर्ता ए सक्रिय हो सकता है लेकिन डी में मैक्रो को कॉल कर सकता है। जब यह स्थिति संभव हो, तो आप इसका उपयोग कर सकते हैं ActiveWorkbook सक्रिय कार्यपुस्तिका को संदर्भित करने के लिए और ThisWorkbook मैक्रो युक्त कार्यपुस्तिका को संदर्भित करने के लिए।यदि आपको लगता है कि ऐसी संभावना है कि उपयोगकर्ता मैक्रो को किसी अन्य कार्यपुस्तिका से कॉल करेगा, तो आप विशेष रूप से यह पहचानने के लिए सही हैं कि आप मैक्रो वाली कार्यपुस्तिका से कार्यपत्रक चाहते हैं। अन्यथा Set ws = Sheets(1) आपको सक्रिय कार्यपुस्तिका के भीतर एक कार्यपत्रक दिया होगा।

से बचें Sheets(1) या Sheets(2). यहां 1 और 2 टैब पंक्ति के अनुक्रम को संदर्भित करते हैं जिसे उपयोगकर्ता जानबूझकर या गलती से आसानी से बदल सकता है। एक नई कार्यपुस्तिका बनाएं और इस कोड को एक मॉड्यूल में कॉपी करें:

Option Explicit
Sub Test1()

Dim InxWsht As Long

For InxWsht = 1 To Worksheets.Count
Debug.Print Worksheets(InxWsht).Name
Next

End Sub

यदि आपके पास शीट की डिफ़ॉल्ट संख्या के साथ एक्सेल का एक अंग्रेजी संस्करण है, तो यह मैक्रो निम्नलिखित को तत्काल विंडो में आउटपुट करेगा:

Sheet1
Sheet2
Sheet3

अब शीट 2 को स्थानांतरित करें ताकि यह शीट 3 के बाद हो और मैक्रो को फिर से चलाए। आउटपुट अब है:

Sheet1
Sheet3
Sheet2

हमेशा वर्कशीट को नाम से पहचानें; उदाहरण के लिए: वर्कशीट ("लेजर") ताकि उपयोगकर्ता गलती से आपके मैक्रो को तोड़ न सके।


विचार करें Set aCell = .Columns(1).Find . . .

जैसा कि मैंने कहा कि यह कॉलम 1 खोजता है, हालांकि आपकाटेक्स्ट कॉलम I कहता है। यह सिर्फ एक टाइपोग्राफ़िकल त्रुटि हो सकती है लेकिन आपके कोड के मुख्य भाग में कॉलम के लिए अक्षर का उपयोग करने से बचना बेहतर है। जैसे ही नए कॉलम जोड़े जाते हैं या उपयोगकर्ता एक नया अनुक्रम चाहते हैं, कॉलम चलते हैं। कोड के माध्यम से यह पहचानने की कोशिश करना कि कौन से नंबर एक कॉलम को संदर्भित करते हैं ताकि आप उन्हें अपडेट कर सकें, एक बुरा सपना हो सकता है जिससे आसानी से बचा जा सके।

Const ColName As Long = 9

या

Const ColName As String = "I"

आपको लिखने की अनुमति देता है

Set aCell = .Columns(ColName).Find . . .

अब यदि कॉलम में लेज़र के नाम हैंचलता है, शीर्ष पर एक परिवर्तन कोड को अद्यतन करता है। एक फायदा यह भी है कि "ColName" का अर्थ भविष्य के रखरखाव प्रोग्रामर के लिए कुछ है (जो आप हो सकते हैं)। यदि आपने कभी किसी मैक्रो को अपडेट करने का प्रयास किया है जिसमें लेखक संख्या के आधार पर 20 अलग-अलग कॉलमों को संदर्भित करता है, तो आप समझेंगे कि मुझे नाम क्यों पसंद हैं।


मैंने आपके नामों की सूची को . के कॉलम "ए" में लोड किया हैवर्कशीट "लेजर"। नीचे आपके मैक्रो का संशोधित संस्करण है। मेरे परिवर्तनों का अध्ययन करें और यह समझने का प्रयास करें कि मैंने उन्हें क्यों बनाया। आवश्यक प्रश्नों के साथ वापस आएं लेकिन जितना अधिक आप अपने लिए काम कर सकते हैं, उतनी ही तेजी से आपका विकास होगा।

Sub Sample()

Const ColName As Long = 1
Const ColFirstWanted As Long = 2

Dim ws As Worksheet
Dim MyAr As Variant
Dim SearchString As String
Dim aCell As Range
Dim ColCrnt As Long   " Avoid names like i; they can get very confusing.
Dim ColLast As Long

SearchString = "Dividend Income"

"~~> Change this as applicable
Set ws = Worksheets("Ledgers")

With ws
Set aCell = .Columns(ColName).Find(What:=SearchString, LookIn:=xlValues, _
LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)

If Not aCell Is Nothing Then
" Find last used column in row
ColLast = .Cells(aCell.Row, Columns.Count).End(xlToLeft).Column

"~~> Amend as applicable
"~~> Store the values From say Col B to E in the array
"## Note: Transpose is slow when called from VBA.
MyAr = .Range(.Cells(aCell.Row, ColFirstWanted), .Cells(aCell.Row, ColLast)).Value

"~~> Check what is in the array
" ## Note: Although the worksheet row is not 1 and the first column is not 1,
" ##       the lower bounds are both 1. This can be confusing. I suggest
" ##       loading the entire row so the worksheet column numbers match the array
" ##       column numbers.  A few extra columns in the array is a small price to pay
" ##       reduced confusion.
For ColCrnt = LBound(MyAr, 2) To UBound(MyAr, 2)
Debug.Print ColCrnt & " " & MyAr(1, ColCrnt)
Next ColCrnt
End If
End With
End Sub