|
You should look at the PropertyBag object which was designed for percisely this.
hope this helps,
sivilian
|
|
|
|
|
Is it possible to execute a function IF a comment (cell comment) was inserted on a particular worksheet?
My application dynamically creates new worksheets, and data is constantly changed. I need to be able to call a function regardless of the worksheet after a user enters a cell comment.
-----
My initial idea was to try and figure out a way to programatically add code to the worksheet object as it is created.. Although I wasnt able to figure out how to do so. (Worksheet object, as in the code that handles the worksheet events)
If anyone can tell me how to "programatically" add code to the worksheet object, that would also help.
__________________
|
|
|
|
|
Well, after trying many things, I have finally come up with a solution to this problem. If anyone else is interested, or if anyone searches for this topic in the future, here is what i did to solve my problem.
The following code was inserted in the "ThisWorkbook" Excel object:
Code:
Dim PrevCommentCount As Integer
Dim CurrCommentCount As Integer
Dim CWSName As String
Dim PWSName As String
'Sh corresponds to current sheet
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
CWSName = Sh.Name
CurrCommentCount = Sh.Comments.Count
End Sub
'Sh corresponds to previous sheet
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
PWSName = Sh.Name
PrevCommentCount = Sh.Comments.Count
If PrevCommentCount <> CurrCommentCount And PWSName = CWSName Then
Call Utils.UpdateCommentForSheet(Sh.Name)
End If
End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
If Sh.Comments.Count <> CurrCommentCount Then
Call Utils.UpdateCommentForSheet(Sh.Name)
CurrCommentCount = Sh.Comments.Count
End If
End Sub Basically, what happens is. when you select a new worksheet, it will store the number of comments found in that worksheet.
Once a new range is selected, or a new worksheet is selected, it will check the number of comments in the worksheet again. If this number is not the same, then a comment was changed.
It probably isn't the most efficient way to do it, although it seems to be the only way if you ask me
If anyone has any other ways to do this let me know.
|
|
|
|
|
Hi Jon. Here's another approach.
Option Explicit
Dim m_changedComment_Cell As Range
Dim m_changedComment_Text As String
Private Sub Workbook_SheetSelectionChange(ByVal sh As Object, _
ByVal Target As Range)
'--when the selection is changed, see if a
'-- comment was added/deleted/modified
LookForChangedComment
End Sub
Private Sub LookForChangedComment()
On Error GoTo End_LookForChangedComment
Dim sMessage As String
If m_changedComment_Text <> m_changedComment_Cell.NoteText Then
'-- a comment has been changed; do something useful?
sMessage = "Changed Comment Occured" & vbCrLf & _
"Cell: " & m_changedComment_Cell.Address & vbCrLf & _
"Old Value: " & m_changedComment_Text & vbCrLf & _
"New value: " & m_changedComment_Cell.NoteText
MsgBox sMessage
End If
End_LookForChangedComment:
Set m_changedComment_Cell = ActiveCell
m_changedComment_Text = m_changedComment_Cell.NoteText
End Sub This code is executing in the SheetSelectionChange event. It would probably make sense to add it to others for completeness (like the save event, or the activate/deactivate events).
|
|
|
|
|
Ok, so i have a custom class i created for variables
<br />
Public Class ptbounds<br />
Public Left As Integer<br />
Public Right As Integer<br />
Public Top As Integer<br />
Public Bottom As Integer<br />
Public Width As Integer<br />
Public Height As Integer<br />
Public hoffset As Integer<br />
Public woffset As Integer<br />
End Class<br />
and i want to compare 2 variables of this type as being = or != (in vb terms of course, but the html tags interfere with proper notation).... how would i define the rules for that?
|
|
|
|
|
Currently, VB.NET doesn't support Operator Overloading (support for this will show up in VB.NET 2005!) So, you'll have to write a method into your class that takes an instance of itself as a parameter and returns a True or False value based on the result of the combined comparisons of all the properties involved:
Public Class PtBounds
Public Left As Integer
Public Right As Integer
Public Top As Integer
Public Bottom As Integer
Public Width As Integer
Public Height As Integer
Public hoffset As Integer
Public woffset As Integer
Public Function op_Compare(ByRef operand As PtBounds) As Boolean
Return (Me.Left = operand.Left) And _
(Me.Right = operand.Right) And _
(Me.Top = operand.Top) And _
(Me.Bottom = operand.Bottom) And _
(Me.Width = operand.Width) And _
(Me.Height = operand.Height) And _
(Me.hOffset = operand.hOffset) And _
(Me.wOffset = operand.wOffset)
End Function
End Class
<code>Me</code> refers to the current instance of the class, while <code>operand</code> refers to the instance that is passed to the method:
<pre> Dim myObject1 As New PtBounds
Dim myObject2 As New PtBounds
' Setup both objects with appropriate values...
If myObject1.op_Compare(myObject2) Then
' Both objects are equal!
Else
' The objects are not equal!
End If
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
I would expand on that to say that it is better to implement the IComparable interface than to create your own method. That way, the code that uses it is more standard, and your class is more flexible.
|
|
|
|
|
Normally, I'd say "do that" too, but in his case, I think it was more important to get the idea of operator overloading acrossed then it was to bring up IComparable. In the future, when he wants to, say, sort items, we can take him through an IComparable implementation.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
im trying to drag staff member names from lstAvailableStaff to lstCurrentJobStaff. For some or other reason it keeps on dragging the same name everytime.A speedy reply would be most appreciated.
Here is the code:
Public Class frmAssignStaff
Inherits System.Windows.Forms.Form
Dim selectedStaffMember As String
Private Sub lstAvailableStaff_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles lstAvailableStaff.MouseDown
selectedStaffMember = lstAvailableStaff.SelectedItem
lstAvailableStaff.DoDragDrop(selectedStaffMember, DragDropEffects.Copy Or DragDropEffects.Move)
End Sub
Private Sub lstCurrentJobStaff_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles lstCurrentJobStaff.DragDrop
Dim test As String
'''***Cant get e.data.....to change value!!!
test = e.Data.GetData(DataFormats.Text).ToString
lstCurrentJobStaff.Items.Add(test)
End Sub
Private Sub frmAssignStaff_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
lstCurrentJobStaff.AllowDrop = True
End Sub
Private Sub lstCurrentJobStaff_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles lstCurrentJobStaff.DragEnter
If (e.Data.GetDataPresent(DataFormats.Text)) Then
e.Effect = DragDropEffects.Copy
Else
e.Effect = DragDropEffects.None
End If
btnRemove.Visible = True
End Sub
End Class
Plz help a poor student
|
|
|
|
|
im trying to drag staff member names from lstAvailableStaff to lstCurrentJobStaff. For some or other reason it keeps on dragging the same name everytime.A speedy reply would be most appreciated.
Here is the code:
Public Class frmAssignStaff
Inherits System.Windows.Forms.Form
#Region " Windows Form Designer generated code "
Public Sub New()
MyBase.New()
'This call is required by the Windows Form Designer.
InitializeComponent()
'Add any initialization after the InitializeComponent() call
End Sub
'Form overrides dispose to clean up the component list.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
Friend WithEvents lstAvailableStaff As System.Windows.Forms.ListBox
Friend WithEvents grpAvailableStaff As System.Windows.Forms.GroupBox
Friend WithEvents grpCurrentJobStaff As System.Windows.Forms.GroupBox
Friend WithEvents lstCurrentJobStaff As System.Windows.Forms.ListBox
Friend WithEvents btnSave As System.Windows.Forms.Button
Friend WithEvents btnCancel As System.Windows.Forms.Button
Friend WithEvents btnAdd As System.Windows.Forms.Button
Friend WithEvents btnRemove As System.Windows.Forms.Button
Friend WithEvents TextBox1 As System.Windows.Forms.TextBox
Friend WithEvents Button1 As System.Windows.Forms.Button
<system.diagnostics.debuggerstepthrough()> Private Sub InitializeComponent()
Me.lstAvailableStaff = New System.Windows.Forms.ListBox
Me.grpAvailableStaff = New System.Windows.Forms.GroupBox
Me.grpCurrentJobStaff = New System.Windows.Forms.GroupBox
Me.lstCurrentJobStaff = New System.Windows.Forms.ListBox
Me.btnSave = New System.Windows.Forms.Button
Me.btnCancel = New System.Windows.Forms.Button
Me.btnAdd = New System.Windows.Forms.Button
Me.btnRemove = New System.Windows.Forms.Button
Me.TextBox1 = New System.Windows.Forms.TextBox
Me.Button1 = New System.Windows.Forms.Button
Me.grpAvailableStaff.SuspendLayout()
Me.grpCurrentJobStaff.SuspendLayout()
Me.SuspendLayout()
'
'lstAvailableStaff
'
Me.lstAvailableStaff.Items.AddRange(New Object() {"Falicia", "Ferzhana", "Asheeqah", "Kathryn", "!!JonnoMan!!"})
Me.lstAvailableStaff.Location = New System.Drawing.Point(16, 24)
Me.lstAvailableStaff.Name = "lstAvailableStaff"
Me.lstAvailableStaff.Size = New System.Drawing.Size(264, 368)
Me.lstAvailableStaff.TabIndex = 0
'
'grpAvailableStaff
'
Me.grpAvailableStaff.Controls.Add(Me.lstAvailableStaff)
Me.grpAvailableStaff.Location = New System.Drawing.Point(8, 8)
Me.grpAvailableStaff.Name = "grpAvailableStaff"
Me.grpAvailableStaff.Size = New System.Drawing.Size(296, 400)
Me.grpAvailableStaff.TabIndex = 1
Me.grpAvailableStaff.TabStop = False
Me.grpAvailableStaff.Text = "Available Staff"
'
'grpCurrentJobStaff
'
Me.grpCurrentJobStaff.Controls.Add(Me.lstCurrentJobStaff)
Me.grpCurrentJobStaff.Location = New System.Drawing.Point(384, 8)
Me.grpCurrentJobStaff.Name = "grpCurrentJobStaff"
Me.grpCurrentJobStaff.Size = New System.Drawing.Size(288, 400)
Me.grpCurrentJobStaff.TabIndex = 2
Me.grpCurrentJobStaff.TabStop = False
Me.grpCurrentJobStaff.Text = "Current Job Staff"
'
'lstCurrentJobStaff
'
Me.lstCurrentJobStaff.AllowDrop = True
Me.lstCurrentJobStaff.Location = New System.Drawing.Point(16, 24)
Me.lstCurrentJobStaff.Name = "lstCurrentJobStaff"
Me.lstCurrentJobStaff.Size = New System.Drawing.Size(264, 368)
Me.lstCurrentJobStaff.TabIndex = 0
'
'btnSave
'
Me.btnSave.Location = New System.Drawing.Point(229, 424)
Me.btnSave.Name = "btnSave"
Me.btnSave.TabIndex = 3
Me.btnSave.Text = "&Save"
'
'btnCancel
'
Me.btnCancel.Location = New System.Drawing.Point(384, 424)
Me.btnCancel.Name = "btnCancel"
Me.btnCancel.TabIndex = 4
Me.btnCancel.Text = "&Cancel"
'
'btnAdd
'
Me.btnAdd.Location = New System.Drawing.Point(312, 176)
Me.btnAdd.Name = "btnAdd"
Me.btnAdd.Size = New System.Drawing.Size(64, 23)
Me.btnAdd.TabIndex = 5
Me.btnAdd.Text = ">>"
'
'btnRemove
'
Me.btnRemove.Location = New System.Drawing.Point(312, 216)
Me.btnRemove.Name = "btnRemove"
Me.btnRemove.Size = New System.Drawing.Size(64, 23)
Me.btnRemove.TabIndex = 6
Me.btnRemove.Text = "<<"
Me.btnRemove.Visible = False
'
'TextBox1
'
Me.TextBox1.AllowDrop = True
Me.TextBox1.Location = New System.Drawing.Point(104, 424)
Me.TextBox1.Name = "TextBox1"
Me.TextBox1.TabIndex = 7
Me.TextBox1.Text = "TextBox1"
'
'Button1
'
Me.Button1.Location = New System.Drawing.Point(16, 424)
Me.Button1.Name = "Button1"
Me.Button1.TabIndex = 8
Me.Button1.Text = "Button1"
'
'frmAssignStaff
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(688, 470)
Me.Controls.Add(Me.Button1)
Me.Controls.Add(Me.TextBox1)
Me.Controls.Add(Me.btnRemove)
Me.Controls.Add(Me.btnAdd)
Me.Controls.Add(Me.btnCancel)
Me.Controls.Add(Me.btnSave)
Me.Controls.Add(Me.grpCurrentJobStaff)
Me.Controls.Add(Me.grpAvailableStaff)
Me.Name = "frmAssignStaff"
Me.Text = "frmAssignStaff"
Me.grpAvailableStaff.ResumeLayout(False)
Me.grpCurrentJobStaff.ResumeLayout(False)
Me.ResumeLayout(False)
End Sub
#End Region
Dim selectedStaffMember As String
Private Sub lstAvailableStaff_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles lstAvailableStaff.MouseDown
selectedStaffMember = lstAvailableStaff.SelectedItem
lstAvailableStaff.DoDragDrop(selectedStaffMember, DragDropEffects.Copy Or DragDropEffects.Move)
End Sub
Private Sub lstCurrentJobStaff_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles lstCurrentJobStaff.DragDrop
Dim test As String
'''***Cant get e.data.....to change value!!!
test = e.Data.GetData(DataFormats.Text).ToString
lstCurrentJobStaff.Items.Add(test)
End Sub
Private Sub frmAssignStaff_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
lstCurrentJobStaff.AllowDrop = True
End Sub
Private Sub lstCurrentJobStaff_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles lstCurrentJobStaff.DragEnter
If (e.Data.GetDataPresent(DataFormats.Text)) Then
e.Effect = DragDropEffects.Copy
Else
e.Effect = DragDropEffects.None
End If
btnRemove.Visible = True
End Sub
End Class
Plz help a poor student
|
|
|
|
|
how can i interface my scanner with vb.net
saud
|
|
|
|
|
Your best bet is to see if the manufacturer of the scanner has an SDK available. WIth an SDK, you'll probably be able to use all the features of the scanner. Otherwise, you'll be using the Windows Image Acquisition API (First available in Windows XP.) But, you'll just get the basic scanning abilities. You won't get to use any specific features of your scanner.
The documentation on the WIA Automation Layer begins here[^] on MSDN.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
Hello all,
I have a little .NET vs. VS 6 user control curiosity! *^_^* any takers?
If I have a project that contains a user control that I made in VS6 and then want to convert it to VS.NET, can I still call the component / dll from within a test application that was created mainly in VB6? Does anyone have exerience with the conversion of user controls - because when the project with the user control is converted to .Net, the user control code is totally gone in the .Net version of the project!
Well a little insight would help me a long way!
Thanks guys,
Maria
Maria
|
|
|
|
|
Well, your best bet is to rewrite the project in VB.NET. You CAN use a VB.NET User Control in VB6. But since the Forms and Controls work VERY much differently between the two versions, you'll spend more time getting the new controls to work in the old VB6 than if you just rewrote both projects in VB.NET.
The Visual Basic 6 Upgrade Wizard in Visual Studio .NET 2003 will upgrade VB6 User Control projects, as well as Standard .EXE projects, but, as with all automated upgrades, you'll have to tweak, and possibly even re-write the code that the Wizard generates.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
Is there a max number of files a folder can have in Windows 2000? How many?
Is there a max size a folder can have in Windows 2000? How many?
What about other Windows versions?
1fm1fu
|
|
|
|
|
These values are not really dependant on Windows, rather they are limitations of the file system the drive was formatted with.
steff kamush wrote:
Is there a max number of files a folder can have in Windows 2000? How many?
If the drive is formatted NTFS, there is no limit. Under FAT12, FAT16 and FAT32, I think the limit for the root directory ONLY is 512 files.
steff kamush wrote:
Is there a max size a folder can have in Windows 2000? How many?
Under any file system, no there is no limit to the total size of the files in a folder.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
I have tried out Microsofts code for Creating Control Arrays in Visual Basic .NET
The ButtonArray project works just as they say.....amazing !
The ClickHandler generates a messagebox with the button you have just pushed tag info displayed.
It is located in the code of the Class ButtonArray.vb
I want to use this information back in Form1 to run other subroutines etc.
How do I jump back into the Form1 with the button info from within the buttonarray.vb ClickHandler to carry on with the rest of my program ???
Here is the link to the Microsoft article and code
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vstechart/html/vbtchCreatingControlArraysInVisualBasicNETVisualCNET.asp
I am only a beginner......
Tim Eaden
Automation Engineer
PPCS
New Zealand
|
|
|
|
|
Your event handler is already running on Form1.
All you have to do is call the other functions with the Tag data, but, of course, your functions must be written to expect the Tag data.
Private Sub mySubroutine(ByVal TagData As String)
' Code for your subroutine goes here.
' TagData is the data that was passed from the Click Event handler.
End Sub
Private Sub ClickHandler(ByVal sender As Object, ByVal e As System.EventArgs)
Dim tagData As String = CType(CType(sender, System.Windows.Forms.Button).Tag, String))
MsgBox("Whatever message box you had here displaying the Tag data...")
' Now call your other functions...
mySubroutine(tagData)
End Sub
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
Dave
The ClickHandler is in the buttonArray.vb code. When I try to call mySubroutine from the Clickhandler I get "Name 'mySubroutine' is not declared"
I know I am missing something really basic here, I cant seem to call any subs in the Form1.vb code from the ButtonArray.vb code...........what am I doing wrong ?
I can call the subs in ButtonArray.vb by using MyControlArray.Sub()
Why cant I call back the other way ?
Thanks in advance
Tim
Tim Eaden
Automation Engineer
PPCS
New Zealand
|
|
|
|
|
TimKiwi wrote:
When I try to call mySubroutine from the Clickhandler I get "Name 'mySubroutine' is not declared"
Uhhh....You have to replace the mySubroutine with whatever routine you want to run! In the code I posted, "mySubroutine" wasn't defined anywhere, so of course that error came up. You can't just copy and paste my code into yours and expect it to work. It was only an example to demonstrate a concept. You have to put YOUR code in the place of "mySubroutine".
TimKiwi wrote:
I know I am missing something really basic here, I cant seem to call any subs in the Form1.vb code from the ButtonArray.vb code...........what am I doing wrong ?
I can call the subs in ButtonArray.vb by using MyControlArray.Sub()
Why cant I call back the other way ?
This is because the ButtonArray clas know nothing of the Form1 class your trying to call back into. In a proper desgin, the ButtonArray class shouldn't have to call back into Form1 and makes changes to it. Form1 should make all the changes to Form1. The reason why it works one way and not the other is because your Form1 code instantiated a ButtonArray object and not the other way around. If you have ButtonArray instantiate Form1, you'll end up with TWO Form1's and the calls ButtonArray makes will not go to the original Form1.
From the questions you've posted, it looks like your just starting in VB.NET. I would HIGHLY recommend picking up a book on Beginning Visual Basic .NET and start from there. There are alot of concepts that you need to pick up to understand whats going on and the Forums are no the place to do that...
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
hi,
i use the belowe code:
Dim emailMessage As MailMessage
emailMessage = New MailMessage
emailMessage.From = "m_nahid2001@yahoo.com"
emailMessage.To = "sondos_bahadori@yahoo.com"
emailMessage.Subject = "mail"
emailMessage.Body = "sallam"
SmtpMail.SmtpServer = "smtpmailserver.myISP.com"
SmtpMail.Send(emailMessage)
but it cause this error:
Could not access 'CDO.Message' object.
|
|
|
|
|
Make sure you machine has either Outlook (Microsoft Office) installed or has Internet Information Server installed.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
hi!
my program dosen't know the system.web.mail
please help me .
thanks alot.
|
|
|
|
|
hi!
my program dosen't know the system.web.mail
please help me .
thanls alot.
|
|
|
|
|
Have you added System.Web to your references list? If not, follow these instructions:
1. For the Visual Basic project you are working on, right-click on the "References" folder and click "Add Reference...".
2. Scroll down the list of components on the ".NET" tab and double-click the "System.Web.dll" component, choosing to add it to your references.
3. Click OK.
4. Also add Imports System.Web.Mail to the top of the vb source file.
Now compile your project. It should work then. Best of luck on your future programming efforts!
Happy Programming and God Bless!
Internet::WWW::CodeProject::bneacetp
|
|
|
|
|