PDA

View Full Version : ต้องการหารหัส VBA แสดงชื่อของเซลล์



สมเกียรติ
14 Jun 2012, 08:32
สวัสดีครับ

สมมติว่า เราตั้งชื่อเซลล์ A1 ว่า "Goal"

จะหาว่าเซลล์ A1 มีชื่อว่าอะไร ได้อย่างไรด้วย VBA

ขอบคุณครับ

gaka
14 Jun 2012, 09:09
ผมทำเป็น ฟังชั่นหาออกมาครับ
เอา range() ไปครอบมันเลยก็ได้ชือออกมาเหมือนกัน
ขอลบออกเพราะมันทำงานไม่ได้ :( ทำไมเดี่ยวรันผ่านเดี๋ยวไม่ผ่าน งง

neang
14 Jun 2012, 12:24
สวัสดีครับ
ตามความเข้าใจของผม คืออาจารย์ต้องการหา ว่า cellใดๆเพียง1cell อยู่ใน name ใด
ผมได้ลองเขียน vba เป็น function ดังนี้ครับ

Function NameFromCell(Getrange As Range) Dim i As Integer
Dim namerange As Range
Dim Elerange As Range
For i = 1 To Workbooks.Application.Names.Count
Set namerange = Range(Workbooks.Application.Names(i).Value)
For Each Elerange In namerange
If Elerange.Address = Getrange.Address Then
NameFromCell = Workbooks.Application.Names(i).Name
Exit Function
End If
Next
Next
End Function
ขั้นตอน ที่1 คือเราต้องกำหนด range ของแต่ละname ไว้ตัวแปล range ก่อนโดยอาศัย for next วนloop ทุกname ครับ
แล้ว set ค่า rangeของ name ไว้ตัวแปร แต่ละืnames

ขั้นตอนที่ 2 คืออาศัย for each หาค่า range ใน rangeของname แต่ละตัว

ขั้นตอนที่ 3 เปรียบเทียบaddress ที่เราต้องการหา กับ rangeที่อยู่ในName ใดๆ ว่าตรงกันหรือยัง ถ้าตรงก็แสดงชื่อ name นั้นครับ

ไม่ทราบว่าแบบนี้จะได้ตรงกับคำตอบหรือไม่นะครับ ^^ ขออภัยด้วยถ้าผิดพลาดนะครับ

สมเกียรติ
14 Jun 2012, 12:49
ที่มาของคำถามเกิดจากการใช้ Event ตามนี้ครับ

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
อยากตรวจสอบ Target ว่าเป็นเซลล์ที่ตั้งชื่อไว้ตามนั้นหรือไม่ ถ้าใช่จึงทำงานต่อ
End Sub

ตอนนี้คิดออกมาได้แต่เพียงใช้ address ตรวจสอบว่าตรงกับ address ของชื่อ New ที่ตั้งไว้ ตามนี้ครับ

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = Range("New").Address Then
RunMyCode
End If
End Sub

ไม่อยากใช้การตรวจสอบ intersect ด้วยครับ ถ้าใช้แบบคุณ neang ยาวทีเดียว น่าจะมีวิธีสั้นๆ :toetap05:

vajra
14 Jun 2012, 13:48
ขออภัย

PichaiTC
14 Jun 2012, 14:16
ยังไม่ค่อยเข้าใจคำถามครับ
ขอยืนยันความเข้าใจหน่อยครับ
1. จะมีการตั้ง ชื่อ ไว้หลาย ชื่อ ใน sheet?
2. แต่ละชื่อ จะอ้างอิงถึงแค่ 1 cell ?
3. เมื่อเลือกที่ cell ที่มีการตั้ง ชื่อ ไว้ จะทำงานแตกต่างกันไปตาม ชื่อ ที่ตั้งไว้ ?
4. ไม่มีการแสดงชื่อกำกับ เช่น ข้อความใน A1 = "Goal" แล้ว B1 ตั้ง ชื่อ ว่า Goal ?

สมเกียรติ
14 Jun 2012, 14:40
ขอแบบง่ายๆก่อนครับ ในแฟ้มมีแค่ชื่อเดียว ที่เซลล์เดียว A1 ตั้งชื่อว่า New
เซลล์ A1 มีค่าใดๆหรือไม่มีค่าก็ได้ครับ

แทนที่จะใช้รหัสตามแฟ้มแนบนี้ อยากให้แสดง MsgBox เมื่อเซลล์ A1 มีค่าเปลี่ยนไป

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = Range("New").Address Then
MsgBox "Hello"
End If
End Sub

ส่วนที่เป็นสีแดง ผมอยากหารหัสที่ใช้ตรวจสอบว่า A1 มีชื่อว่า New แทนครับ

ผมลองแบบนี้แล้วไม่ทำงาน

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Names.Name = "New" Then
MsgBox "Hello"
End If
End Sub

PichaiTC
14 Jun 2012, 14:52
ขอโทษนะครับ ยังไม่เข้าใจจริงๆ
ผมกลับรู้สึกว่า code ของอาจารย์ ก็น่าจะใช้งานได้ดีอยู่แล้ว แต่อาจาย์กลับว่าอยากได้อีกแบบแทน ผมเลยตีความจนไปไม่ถูกเหมือนกัน :confused:

vajra
14 Jun 2012, 15:10
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
For Each i In Application.Names
If InStr(i, Target.Address) > 0 Then MsgBox i.Name
Next
End Sub

neang
14 Jun 2012, 16:01
ขอแบบง่ายๆก่อนครับ ในแฟ้มมีแค่ชื่อเดียว ที่เซลล์เดียว A1 ตั้งชื่อว่า New
เซลล์ A1 มีค่าใดๆหรือไม่มีค่าก็ได้ครับ

แทนที่จะใช้รหัสตามแฟ้มแนบนี้ อยากให้แสดง MsgBox เมื่อเซลล์ A1 มีค่าเปลี่ยนไป

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = Range("New").Address Then
MsgBox "Hello"
End If
End Sub

ส่วนที่เป็นสีแดง ผมอยากหารหัสที่ใช้ตรวจสอบว่า A1 มีชื่อว่า New แทนครับ

ผมลองแบบนี้แล้วไม่ทำงาน

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Names.Name = "New" Then
MsgBox "Hello"
End If
End Sub
ผมลอง code ตามนี้นะครับ คือ ผมกำหนด Name ชื่อว่า goal range คือ A1 จะได้ว่า names ชื่อ goal มีแค่cell A1 ครับ

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = Range(Application.Names("goal").Value).Address Then MsgBox "hello"
End Sub
ไม่ทราบตรงกับความต้องการหรือไม่นะครับ ^^

สมเกียรติ
14 Jun 2012, 18:25
ขอโทษนะครับ ยังไม่เข้าใจจริงๆ
ผมกลับรู้สึกว่า code ของอาจารย์ ก็น่าจะใช้งานได้ดีอยู่แล้ว แต่อาจาย์กลับว่าอยากได้อีกแบบแทน ผมเลยตีความจนไปไม่ถูกเหมือนกัน :confused:

ใช่ครับใช้งานได้อยู่แล้ว เพียงแต่รู้สึกว่าน่าจะมีทางที่ลัดสั้นกว่านี้อยู่อีก

แทนที่ต้องหา address น่าจะเอาชื่อของเซลล์ Target มาตรวจสอบเลยว่าตรงกับชื่อของเซลล์ที่ใช้ทำงานหรือไม่
ผมลองค้นหาจาก google ก็ไม่มีทางอื่นอีก เลยยกปัญหาที่คิดกันไม่ออกมาให้คิดกัน(ไม่ออก)อีกครับ

ทำไม Microsoft จึงไม่สร้างสูตรให้คิดย้อนหาชื่อของเซลล์ไว้บ้าง
มีแต่ตั้งชื่อให้กับเซลล์

สมเกียรติ
14 Jun 2012, 18:26
ผมลอง code ตามนี้นะครับ คือ ผมกำหนด Name ชื่อว่า goal range คือ A1 จะได้ว่า names ชื่อ goal มีแค่cell A1 ครับ

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = Range(Application.Names("goal").Value).Address Then MsgBox "hello"
End Sub
ไม่ทราบตรงกับความต้องการหรือไม่นะครับ ^^

ไม่เอา address ครับ แบบนี้ปกติทำได้อยู่แล้ว
ถ้าคิดทางอื่นไม่ได้ ก็คงต้องใช้ address กันต่อไป

สมเกียรติ
14 Jun 2012, 18:29
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
For Each i In Application.Names
If InStr(i, Target.Address) > 0 Then MsgBox i.Name
Next
End Sub

ขอบคุณครับ แต่ไม่อยากใช้ address

อรวีร์
14 Jun 2012, 23:09
MsgBox Range("A1").Name.NameLocal

สมเกียรติ
15 Jun 2012, 08:07
MsgBox Range("A1").Name.NameLocal

ขอบคุณครับ ใช้งานได้แล้ว

ในแฟ้มแนบผมใช้ GoalSeek คิดย้อนหาตัวเลขที่มาคูณกันเป็นตัวเลขคำตอบที่ต้องการในเซลล์ New

เมื่อพิมพ์ตัวเลขใหม่ลงไปใน New แล้ว ต้องการให้เป็น Event กระตุ้นให้ GoalSeek ทำงานเองครับ

ผมใช้ Event ตามนี้

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

On Error GoTo Myline
If Target.Name.NameLocal = "New" Then
RunSeek
MsgBox "GoalSeek Done"
End If
End
Myline:
MsgBox "Do Nothing"

End Sub

ต้องดัก error ไว้ก่อนเพราะถ้าใช้เซลล์อื่นๆที่ไม่ใช่ New จะเกิด error ขึ้นมา

มีทางอื่นที่ลัดสั้นกว่านี้อีกไหมครับ หรือจะใช้ event อื่นดี :toetap05: