VBA CleanFileName এবং CleanUsedRange


0

আমি নিম্নলিখিত কোড সঙ্গে কিছু সমস্যা হচ্ছে। যখনই আমি VBA কোড চালাই, তখন CleanFileName এবং CleanUsedRange কোড আমার ভলিউম সূত্র মোছা হয়।

এটি দৃশ্যমান সূত্রগুলি মুছে ফেলার ব্যতীত পরিচ্ছন্ন ফাইল নাম এবং ক্লিয়ার ব্যবহৃত রেঞ্জ ব্যবহার করার উপায় আছে। কোড নিচে

 Private Sub CommandButton1_Click()
Const FULL_PATH = "C:\Documents\test\quot.txt"
Dim fId As String, txt As String, txtLen As Long, d As Object, dc As Long

fId = FreeFile
Open FULL_PATH For Input As fId
    txt = Input(LOF(fId), fId)  'Read entire file (not line-by-line)
Close fId
txtLen = Len(txt)
Set d = CreateObject("Scripting.Dictionary")
d("Name") = "C11"   'Same as: d.Add Key:="Name", Item:="C11"
d("Phone") = "H13"
d("Address1") = "C15"
d("Email") = "C13"
d("Postcode") = "H16"
d("SR") = "C10"
d("MTM") = "H14"
d("Serial") = "H15"
d("Problem") = "C17"
d("Action") = "C18"
d("Dated") = "H10"
dc = d.Count

Dim i As Long, k As String, sz As Long, found As Long
With ThisWorkbook.Worksheets("Sheet1")     '<--- Update sheet name
    For i = 0 To dc - 1     'd.Keys()(i) is a 0-based array
        k = d.Keys()(i)     'Name, Phone, etc
        found = InStr(txt, k) + Len(k) + 1  'Find the (first) key in file
        If found > 0 Then   'Determine item length by finding the next key
            If i < dc - 1 Then sz = InStr(txt, d.Keys()(i + 1)) Else sz = txtLen + 2
            .Range(d(k)).Value2 = Trim$(Mid$(txt, found, sz - found - 1))
        End If
    Next
End With
End Sub

CleanFile

Public Function CleanFileName(ByVal fName As String) As String
Dim b() As Byte, specialChars As Variant, i As Long

b = "\/:*?|<>" & Chr(34) & Chr(8) & Chr(9) & Chr(10) & Chr(13)

specialChars = Split(StrConv(b, vbUnicode), Chr(0))

fName = Trim$(fName)    'Trim, then remove \ / : * ? | < > " Backspace Tab LF CR
For i = 0 To UBound(specialChars)
    fName = Replace(fName, specialChars(i), vbNullString)
Next
CleanFileName = fName
End Function

দ্বিতীয় কোড

 Public Sub CleanUsedRange(ByRef ur As Range)
Dim arr As Variant, r As Long, c As Long

arr = ur.Formula
For r = 1 To UBound(arr, 1)
    For c = 1 To UBound(arr, 2)
        arr(r, c) = CleanFileName(arr(r, c))
    Next
Next
ur.Formula = arr
End Sub

রপ্তানি কোড

Private Sub CommandButton2_Click()
Dim ws As Worksheet, fPath As String, fName As String, dt As String

Set ws = ThisWorkbook.Worksheets("Sheet1")

fPath = "C:\Documents\test\"
dt = Format(Date, " - MM-DD-YYYY")

CleanUsedRange ws.UsedRange

fName = fPath & ws.Range("C10") & dt & " - Quotation"

ws.Range("A1:I60").ExportAsFixedFormat Type:=xlTypePDF, FileName:=fName
End Sub

দৃষ্টিকোণ সূত্রগুলি অন্য শীট থেকে তথ্য আমদানি করতে ব্যবহার করা হয়, যাতে একটিকে একে অপরকে টাইপ করার প্রয়োজন হয় না। দৃষ্টিভঙ্গি মুছে ফেলার জন্য ক্লিনফিলটি চালু করার উপায় নেই।


আপনি প্রস্তাবিত কোড সম্পাদনা করার পরে

Private Sub CommandButton2_Click()
Dim ws As Worksheet, fPath As String, fName As String, dt As String

Set ws = ThisWorkbook.Worksheets("Sheet1")

fPath = "C:\Users\Documents\test\\"
dt = Format(Date, " - MM-DD-YYYY")

Range("C10") = CleanFileName(Range("C10"))


fName = fPath & ws.Range("C10") & dt & " - Quotation"

ws.Range("A1:I60").ExportAsFixedFormat Type:=xlTypePDF, FileName:=fName
End Sub

যাইহোক, এক্সপোর্ট হওয়া ফাইলটি বিদেশী প্রতীক আছে বলে মনে হচ্ছে

Image1

Image2

অন্য কোন সমাধান?

আপনার প্রস্তাবিত কোডটি আমি পরিবর্তিত করেছি কিন্তু আমি ভিবিএ চালাতে অক্ষম। এই যোগ করার পরে:

 .Range(d(k)).Value2 = Trim$(Mid$(txt, found, sz - found - 2))

ত্রুটি নির্দেশ করা হয় যেখানে এই

Open FULL_PATH For Input As fId

ছবি দেখো নতুন ত্রুটি

এছাড়াও আপনি অনুরোধ হেক্স কোড খুঁজুন

হেক্স ছবি

আমি কোড পরিবর্তন করেছি

 Else sz = txtLen + 3

যাইহোক, আমি এখনো সংযুক্ত হচ্ছে 76 সংযুক্ত ত্রুটি 76 এবং ডিবাগ এই লাইন নির্দেশ করা হয়;

 Open FULL_PATH For Input As fId

উত্তর:


0

আমি আপনার subs মনে করি না CleanUsedRange() এবং CleanFileName() আসলে মুছে ফেলা হয় (সম্পূর্ণ) আপনার Vlook সূত্র (তারা যাই হোক না কেন), কিন্তু আপনার সূত্র দ্বারা ধ্বংস করা হতে পারে CleanFileName() হিসাবে এটি নির্দিষ্ট অক্ষর মুছে ফেলা।


আপনার বর্তমান কোড সমস্যার সৃষ্টি করে কেন ব্যাখ্যা করতে, এর কয়েকটি লাইন বিশ্লেষণ করা যাক:

মধ্যে CommandButton2_Click() আপনি ডাকুন CleanUsedRange ws.UsedRange। এখানে, ws বোঝায় "Sheet1" এবং UsedRange ব্যবহৃত পরিসীমা প্রতিনিধিত্ব করে ws, যার অর্থ প্রথম এবং শেষ কলামগুলির (সমেত) এবং প্রথম এবং শেষ সারি (সমেত) সহ কক্ষের পরিসীমা, যার বিষয়বস্তু আছে (বা তথ্য আছে) (উদাঃ তথ্য বা সূত্র)।

মধ্যে CleanUsedRange() আপনি ব্যবহৃত পরিসরের সমস্ত কক্ষগুলি (প্রতিটি সারি এবং কলাম) ঘোরাফেরা করছেন (হিসাবে পাস হয়েছে ur As Range ) এবং কলিং CleanFileName() এই সব কোষ বিষয়বস্তু। এই ফাংশন ( CleanUsedRange() ) আপনার সূত্রগুলি ধ্বংস করার প্রধান কারণ, কারণ এটি আপনার ওয়ার্কশীটে সূত্র হিসাবে সূত্রগুলি প্রেরণ করে CleanFileName() ফাংশন।

মধ্যে CleanFileName(), পাস করা যুক্তিটি এমন কিছু অক্ষরগুলির জন্য চেক করা হয়েছে যা ফাইল নামগুলিতে অবৈধ। পরিবর্তিত যুক্তি তারপর ফাংশন ফলাফল হিসাবে ফিরে।


ফিক্স: পুরো ব্যবহৃত পরিসীমা পাস করবেন না CleanUsedRange() এবং CleanFileName()। আসলে আপনি খোঁচা পারেন CleanUsedRange() উপ সম্পূর্ণরূপে।

কেবলমাত্র একটি ঘর (C10?) পাস করুন যাতে ফাইলের নাম রয়েছে যা পরিষ্কারের প্রয়োজন হতে পারে CleanFileName()

IOW, ইন CommandButton2_Click() প্রতিস্থাপন করা

CleanUsedRange ws.UsedRange

সঙ্গে

Range("C10") = CleanFileName(Range("C10")).

(অনুমান সেল C10 ফাইল নাম ব্যবহার করা হবে।)


"বক্সযুক্ত প্রশ্ন চিহ্ন" সম্পর্কে সম্পাদনা করুন

"বক্সযুক্ত প্রশ্ন চিহ্ন" নিয়ে সমস্যাটির জন্য, আমি দেখেছি যে 32 এরও কম কোড সহ যেকোন চরিত্র একটি সমস্যার সৃষ্টি করে .pdf এক্সেল দ্বারা উত্পাদিত ফাইল (আমার এক্সেলের মধ্যে, শুধুমাত্র Chr (12) একটি "বক্সযুক্ত প্রশ্ন চিহ্ন" হিসাবে দেখানো হয়)। স্পষ্টতই প্রতিটি ক্ষেত্রের মধ্যে দুটি অক্ষর রয়েছে এবং সম্ভাব্যগুলি হল "ক্যারেজ রিটার্ন - লাইন ফিড" (সিআরএলএফ) এর একটি জুড়ি, তবে শুধুমাত্র আপনি এটি নিশ্চিত করতে পারেন, যেহেতু আপনি এই তথ্যটি এখনও সরবরাহ করেন নি।

আপনি থেকে মান পড়া যখন txt আপনি এই কোড ব্যবহার স্ট্রিং:

.Range(d(k)).Value2 = Trim$(Mid$(txt, found, sz - found - 1))

এটা পরিবর্তন

.Range(d(k)).Value2 = Trim$(Mid$(txt, found, sz - found - 2))

আমি একটি মন্তব্য পরামর্শ হিসাবে, সমস্যা প্রতিকার।


ত্রুটি 7.8.2018 সম্পর্কিত সম্পাদনা করুন

প্রথম, ফাইলের জন্য ধন্যবাদ। এটি পরিষ্কারভাবে ফাইলের ক্ষেত্রগুলির মধ্যে একটি CRLF জুড়ি সম্পর্কে আমার সন্দেহ নিশ্চিত করে। এটি নিশ্চিত করে যে আমরা যে পরিমাণ তথ্য সংগ্রহ করি তার দৈর্ঘ্য Mid$() ফাংশন 1 পরিবর্তে 2 দ্বারা হ্রাস করা আবশ্যক।

আমি পূর্ববর্তী সংশোধনের সাথে আপনি যে ত্রুটিটি অনুভব করেছি তা পুনরুত্পাদন করতে সক্ষম নই, তবে শেষ ক্ষেত্রের সাথে এখনও একটি ত্রুটি রয়েছে ("তারিখযুক্ত")। সম্ভবত আপনার পরিবেশে একটি ত্রুটি হিসাবে উত্থাপিত হয়, এটা আমার মধ্যে নয়, কিন্তু বছর ভুলভাবে 201 হিসাবে দেখানো হয়।

শেষ ক্ষেত্রের সাথে ত্রুটি হল যে sz পরিবর্তনশীল ডেটা এক্সট্রাকশন আমরা পূর্ববর্তী পরিবর্তন জন্য ক্ষতিপূরণ বৃদ্ধি করতে হবে (আমরা পরিবর্তন sz - found - 1 থেকে sz - found - 2 )।

সুতরাং, পরিবর্তন

Else sz = txtLen + 2

থেকে

Else sz = txtLen + 3

অবশ্যই, ফাইলটি শেষ ক্ষেত্রটি ("তারিখযুক্ত") পড়ার সময় ত্রুটি ঘটে তখনই এটি সাহায্য করে। এটি যদি সাহায্য না করে তবে দয়া করে ডিবাগ করুন এবং আমাকে জানাবেন যে আপনি কোন ক্ষেত্রটি পড়ছেন এবং ভেরিয়েবল কোন মানগুলি করে k, found এবং sz এটা ব্যর্থ হলে আছে। এছাড়াও প্রদর্শিত হতে পারে যে কোন পপআপ বার্তা সম্পর্কে অবহিত।


হাই টম ব্রুনবার্গ, আমি সংযুক্ত যে মন্তব্য এবং ছবি দেখুন। কোডটি পরিবর্তন করার পরে আপনি প্রস্তাবিত ফাইলটি ... বিদেশী অক্ষরগুলি আমদানি করে ..
gist102

যারা অক্ষর ASCII কোড 12 (দশমিক) আছে বলে মনে হচ্ছে। আমি অবশ্যই প্রস্তাবিত কোড পরিবর্তনের কারণে তারা যোগ করা হয়নি, তাই তারা আপনার নিজের ডেটাতে অবশ্যই থাকা উচিত, যা কোথাও থেকে আমদানি করা দেখায়। ASCII কোড 1২ এর মূলত "ফরম ফিড" অর্থের অর্থ রয়েছে, তবে আপনার ডেটা উৎসের মধ্যে অন্য কোনও অর্থ থাকতে পারে, সম্ভবত "ক্ষেত্র বিভাজক"। অবাঞ্ছিত Chr (12) বাদ দেওয়ার জন্য, আপনি 1 অক্ষরের দ্বারা আমদানি করেন এমন প্রতিটি ডেটা সামগ্রীর দৈর্ঘ্য হ্রাস করার চেষ্টা করুন।
Tom Brunberg

আমি যে কাজ কিন্তু এখনও একই ফলাফল আছে। কোডটি অদৃশ্য হওয়ার একমাত্র উপায় হল যদি আমি "CleanUsedRange ws.UsedRange" ব্যবহার করি এবং যখন আমি এটি "রেঞ্জ (" C10 ") = পরিচ্ছন্নফিলননাম (রেঞ্জ (" C10 ") সহ প্রতিস্থাপন করব)।" ইহা প্রদর্শিত.
gist102

সূত্র। আমি যে কাজ কিন্তু এখনও একই ফলাফল আছে কিভাবে ঠিক? নির্দিষ্ট হতে দয়া করে। আপনি একটি হেক্স এডিটর আছে? যদি হ্যাঁ, আপনার টেক্ট ফাইলটি হেক্স এডিটরতে লোড করুন এবং হেক্স মানের দৃশ্যমানের সাথে সম্পাদকের প্রথম 4 লাইনগুলির একটি স্ন্যাপশট নিন। কোথা থেকে (কোন প্রোগ্রাম) আপনার txt ফাইল আসে? আপনি ডাউনলোড করার জন্য একটি ফাইল উপলব্ধ করতে পারেন?
Tom Brunberg

লেখার সময়, আমি বিশ্বাস করি আমি মুছে ফেলা / ধ্বংস করা সূত্র সম্পর্কিত আপনার প্রকৃত প্রশ্নের উত্তর দিয়েছি এবং "বাক্সযুক্ত প্রশ্ন চিহ্ন" নিয়ে সমস্যার সমাধান করেছি। যদি উত্তরটি সমাধান না হয় তবে দয়া করে আমার পূর্ববর্তী মন্তব্যে অনুরোধকৃত তথ্য সরবরাহ করুন।
Tom Brunberg
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.