Reply
 
LinkBack Thread Tools Search this Thread Display Modes
  #1   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 1
Default Goto misused: help to tidy Code


I have a Listbox fed by RowSource delivering data from Cols A-C. The
code below
deletes a selected row from both the ListBox and the root row on the
worksheet. It works fine except that, try as I would, it does the job
uglily. For one, I have violated one of the cardinal principles of -good
programming- by pandering to the use of GO TO in a way which makes the
code poorly structured.

Could someone kindly have a quick study and restructure the logical
flow without having to loop backwards the way I did? Many thanks.

[PS: I would also love the code to allow for multiple row selection and
resultant block deletions, if possible].


David.

Private Sub CmdDelete_Click()

Restart:
If ListBox1.ListIndex = -1 Then 'no selection
ans = MsgBox("Select item to delete", vbYesNo + vbDefaultButton2)
If ans = vbYes Then
ListBox1.Selected(0) = True 'select 1st item for a start
GoTo Skip
Else
ListBox1.ListIndex = -1
Exit Sub
End If
End If

Skip:
If ListBox1.Selected(1) =False True Then
If ListBox1.Selected(ListBox1.ListIndex) = True Then
ansx = MsgBox("Do you wish to delete selection?" & vbCrLf & "
" & ListBox1.List(ListBox1.ListIndex, 0), vbYesNo +
vbDefaultButton2 + vbInformation)
If ansx = vbNo Then Exit Sub
ActiveSheet.Cells(ListBox1.ListIndex + 1, 1).Resize(,
3).ClearContents
On Error Resume Next
ListBox1.Selected(ListBox1.ListIndex) = False
ansx = MsgBox("Do you wish to delete another?", vbYesNo +
vbDefaultButton1 + vbInformation)
If ansx = vbNo Then
GoTo Sortt
Else
GoTo Restart
End If
End If
End If


Sortt:
Columns("a:c").Sort Key1:=Range("A2"), Key2:=Range("b2"),
Key3:=Range("c2"), Header:=xlNo

ListBox1.RowSource = "a1:c" & [a65536].End(xlUp).Row

End Sub


--
davidm
------------------------------------------------------------------------
davidm's Profile: http://www.excelforum.com/member.php...o&userid=20645
View this thread: http://www.excelforum.com/showthread...hreadid=494441

  #2   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 11,272
Default Goto misused: help to tidy Code

Private Sub CmdDelete_Click()

With Listbox1
Do
If .ListIndex = -1 Then 'no selection
ans = MsgBox("Select item to delete", vbYesNo +
vbDefaultButton2)
If ans = vbNo Then
.ListIndex = -1
Exit Sub
Else
.Selected(0) = True 'select 1st item for a start
End If
End If

If .Selected(1) = False Then
If .Selected(.ListIndex) = True Then
ansx = MsgBox("Do you wish to delete selection?" &
vbCrLf & _
" " & .List(.ListIndex, 0), _
bYesNo + vbDefaultButton2 + vbInformation)
If ansx = vbYes Then
ActiveSheet.Cells(.ListIndex + 1, 1).Resize(,
3).ClearContents
On Error Resume Next
.Selected(.ListIndex) = False
ansx = MsgBox("Do you wish to delete another?", _
vbYesNo + vbDefaultButton1 + vbInformation)
End If
End If
End If
Loop Until ansx = vbNo

Columns("A:C").Sort Key1:=Range("A2"), _
Key2:=Range("b2"), _
Key3:=Range("c2"), _
Header:=xlNo

.RowSource = "A1:C" & Cells(Rows.Count, "A").End(xlUp).Row

End With

End Sub



--
HTH

Bob Phillips

(remove nothere from email address if mailing direct)

"davidm" wrote in
message ...

I have a Listbox fed by RowSource delivering data from Cols A-C. The
code below
deletes a selected row from both the ListBox and the root row on the
worksheet. It works fine except that, try as I would, it does the job
uglily. For one, I have violated one of the cardinal principles of -good
programming- by pandering to the use of GO TO in a way which makes the
code poorly structured.

Could someone kindly have a quick study and restructure the logical
flow without having to loop backwards the way I did? Many thanks.

[PS: I would also love the code to allow for multiple row selection and
resultant block deletions, if possible].


David.

Private Sub CmdDelete_Click()

Restart:
If ListBox1.ListIndex = -1 Then 'no selection
ans = MsgBox("Select item to delete", vbYesNo + vbDefaultButton2)
If ans = vbYes Then
ListBox1.Selected(0) = True 'select 1st item for a start
GoTo Skip
Else
ListBox1.ListIndex = -1
Exit Sub
End If
End If

Skip:
If ListBox1.Selected(1) =False True Then
If ListBox1.Selected(ListBox1.ListIndex) = True Then
ansx = MsgBox("Do you wish to delete selection?" & vbCrLf & "
" & ListBox1.List(ListBox1.ListIndex, 0), vbYesNo +
vbDefaultButton2 + vbInformation)
If ansx = vbNo Then Exit Sub
ActiveSheet.Cells(ListBox1.ListIndex + 1, 1).Resize(,
3).ClearContents
On Error Resume Next
ListBox1.Selected(ListBox1.ListIndex) = False
ansx = MsgBox("Do you wish to delete another?", vbYesNo +
vbDefaultButton1 + vbInformation)
If ansx = vbNo Then
GoTo Sortt
Else
GoTo Restart
End If
End If
End If


Sortt:
Columns("a:c").Sort Key1:=Range("A2"), Key2:=Range("b2"),
Key3:=Range("c2"), Header:=xlNo

ListBox1.RowSource = "a1:c" & [a65536].End(xlUp).Row

End Sub


--
davidm
------------------------------------------------------------------------
davidm's Profile:

http://www.excelforum.com/member.php...o&userid=20645
View this thread: http://www.excelforum.com/showthread...hreadid=494441



  #3   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 35,218
Default Goto misused: help to tidy Code

You have another response to your other post.

davidm wrote:

I have a Listbox fed by RowSource delivering data from Cols A-C. The
code below
deletes a selected row from both the ListBox and the root row on the
worksheet. It works fine except that, try as I would, it does the job
uglily. For one, I have violated one of the cardinal principles of -good
programming- by pandering to the use of GO TO in a way which makes the
code poorly structured.

Could someone kindly have a quick study and restructure the logical
flow without having to loop backwards the way I did? Many thanks.

[PS: I would also love the code to allow for multiple row selection and
resultant block deletions, if possible].

David.

Private Sub CmdDelete_Click()

Restart:
If ListBox1.ListIndex = -1 Then 'no selection
ans = MsgBox("Select item to delete", vbYesNo + vbDefaultButton2)
If ans = vbYes Then
ListBox1.Selected(0) = True 'select 1st item for a start
GoTo Skip
Else
ListBox1.ListIndex = -1
Exit Sub
End If
End If

Skip:
If ListBox1.Selected(1) =False True Then
If ListBox1.Selected(ListBox1.ListIndex) = True Then
ansx = MsgBox("Do you wish to delete selection?" & vbCrLf & "
" & ListBox1.List(ListBox1.ListIndex, 0), vbYesNo +
vbDefaultButton2 + vbInformation)
If ansx = vbNo Then Exit Sub
ActiveSheet.Cells(ListBox1.ListIndex + 1, 1).Resize(,
3).ClearContents
On Error Resume Next
ListBox1.Selected(ListBox1.ListIndex) = False
ansx = MsgBox("Do you wish to delete another?", vbYesNo +
vbDefaultButton1 + vbInformation)
If ansx = vbNo Then
GoTo Sortt
Else
GoTo Restart
End If
End If
End If

Sortt:
Columns("a:c").Sort Key1:=Range("A2"), Key2:=Range("b2"),
Key3:=Range("c2"), Header:=xlNo

ListBox1.RowSource = "a1:c" & [a65536].End(xlUp).Row

End Sub

--
davidm
------------------------------------------------------------------------
davidm's Profile: http://www.excelforum.com/member.php...o&userid=20645
View this thread: http://www.excelforum.com/showthread...hreadid=494441


--

Dave Peterson
  #4   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 1
Default Goto misused: help to tidy Code


Many thanks Dave for both solutions. The second is transplanted here
for consolidation, having mistakenly submitted my first post to a wrong
thread ( when I had meant to initiate one). One again, thanks for your
assistance.

David.


--------------------------------------------------------------------------------
Dave Paterson wrote:

A listbox can support multiple selections. Maybe you could use that to
get all
the rows that that should be deleted/cleared.

I put 2 buttons (cmddelete and cmdcancel) and one listbox (listbox1) on
a
userform.

This was the code behind that userform:

Option Explicit
Dim BlkProc As Boolean
Private Sub cmdCancel_Click()
Unload Me
End Sub
Private Sub cmdDelete_Click()

Dim iCtr As Long
Dim myRng As Range
Dim RngToClear As Range
Dim myArea As Range
Dim resp As Long

resp = MsgBox(Prompt:="Are you sure?", Buttons:=vbYesNo)

If resp = vbNo Then
Exit Sub
End If

Set RngToClear = Nothing

With Me.ListBox1
For iCtr = .ListCount - 1 To 0 Step -1
If .Selected(iCtr) Then
If RngToClear Is Nothing Then
Set RngToClear _
= Application.Range(.RowSource).Rows(iCtr + 1).Cells(1)
Else
Set RngToClear = Union(RngToClear, _
Application.Range(.RowSource).Rows(iCtr + 1).Cells(1))
End If
End If
Next iCtr
End With

If RngToClear Is Nothing Then
'do nothing
Else
For Each myArea In RngToClear.Areas
myArea.Resize(, 3).ClearContents
Next myArea
With Worksheets("Sheet1")
With .Range("a:c")
..Cells.Sort key1:=.Columns(1), order1:=xlascending, _
key2:=.Columns(2), order2:=xlascending, _
key3:=.Columns(3), order3:=xlascending, _
header:=xlNo
Set myRng _
= .Range("a1:C" & .Cells(.Rows.Count, "A").End(xlUp).Row)
End With
End With
Me.cmdDelete.Enabled = False
If Application.CountA(myRng) = 0 Then
'no more data
Me.ListBox1.RowSource = ""
Me.ListBox1.Clear
Else
Me.ListBox1.RowSource = myRng.Address(external:=True)
End If

End If

End Sub

Private Sub ListBox1_Change()
Dim iCtr As Long

If BlkProc = True Then Exit Sub

Me.cmdDelete.Enabled = False

With Me.ListBox1
For iCtr = 0 To .ListCount
If .Selected(iCtr) Then
Me.cmdDelete.Enabled = True
Exit For
End If
Next iCtr
End With

End Sub

Private Sub UserForm_Initialize()
Dim myRng As Range

With Worksheets("Sheet1")
Set myRng = .Range("a1:C" & .Cells(.Rows.Count, "A").End(xlUp).Row)
End With

If Application.CountA(myRng) = 0 Then
'do nothing
Else
With Me.ListBox1
BlkProc = True
..MultiSelect = fmMultiSelectMulti
..ColumnCount = 3
..RowSource = myRng.Address(external:=True)
BlkProc = False
End With
End If

Me.cmdDelete.Enabled = False
Me.cmdCancel.Caption = "Cancel"
Me.cmdDelete.Caption = "Delete"

End Sub

davidm wrote:

I have a Listbox fed by RowSource delivering data from Cols A-C. The
code below
deletes a selected row from both the ListBox and the root row on the
worksheet. It works fine except that, try as I would, it does the

job
uglily. For one, I have violated one of the cardinal principles of

-good
programming- by pandering to the use of GO TO in a way which makes

the
code poorly structured.

Could someone kindly have a quick study and restructure the logical
flow without having to loop backwards the way I did? Many thanks.

[PS: I would also love the code to allow for multiple row selection

and
resultant block deletions, if possible].

David.

Private Sub CmdDelete_Click()

Restart:
If ListBox1.ListIndex = -1 Then 'no selection
ans = MsgBox("Select item to delete", vbYesNo + vbDefaultButton2)
If ans = vbYes Then
ListBox1.Selected(0) = True 'select 1st item for a start
GoTo Skip
Else
ListBox1.ListIndex = -1
Exit Sub
End If
End If

Skip:
If ListBox1.Selected(1) =False True Then
If ListBox1.Selected(ListBox1.ListIndex) = True Then
ansx = MsgBox("Do you wish to delete selection?" & vbCrLf & "
" & ListBox1.List(ListBox1.ListIndex, 0), vbYesNo +
vbDefaultButton2 + vbInformation)
If ansx = vbNo Then Exit Sub
ActiveSheet.Cells(ListBox1.ListIndex + 1, 1).Resize(,
3).ClearContents
On Error Resume Next
ListBox1.Selected(ListBox1.ListIndex) = False
ansx = MsgBox("Do you wish to delete another?", vbYesNo +
vbDefaultButton1 + vbInformation)
If ansx = vbNo Then
GoTo Sortt
Else
GoTo Restart
End If
End If
End If

Sortt:
Columns("a:c").Sort Key1:=Range("A2"), Key2:=Range("b2"),
Key3:=Range("c2"), Header:=xlNo

ListBox1.RowSource = "a1:c" & [a65536].End(xlUp).Row

End Sub

--
davidm

------------------------------------------------------------------------
davidm's Profile:

http://www.excelforum.com/member.php...o&userid=20645
View this thread:

http://www.excelforum.com/showthread...hreadid=494434

--

Dave Peterson


--
Myles
------------------------------------------------------------------------
Myles's Profile: http://www.excelforum.com/member.php...o&userid=28746
View this thread: http://www.excelforum.com/showthread...hreadid=494441

Reply
Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules

Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On


Similar Threads
Thread Thread Starter Forum Replies Last Post
Tidy up multiple find and replace code PSM[_10_] Excel Worksheet Functions 2 April 6th 09 02:00 PM
Goto code Bob Excel Discussion (Misc queries) 4 July 6th 06 05:44 PM
smart & tidy code for many checkBox_Change() Fendic[_16_] Excel Programming 3 August 14th 05 02:52 PM
Tidy Up Pete Excel Discussion (Misc queries) 4 May 9th 05 05:09 PM
Goto Command in Code JimPNicholls Excel Programming 2 September 1st 04 12:38 PM


All times are GMT +1. The time now is 09:37 AM.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Copyright ©2004-2025 ExcelBanter.
The comments are property of their posters.
 

About Us

"It's about Microsoft Excel"