View Full Version : [SOLVED:] Code works every other time
Juriemagic
08-17-2015, 06:08 AM
Hi good people!,
I posted on Mrexcel last week, Aug 14th, have not had any responses. Please, just wondering if someone would be so kind to check this link: http://www.mrexcel.com/forum/excel-questions/875686-code-works-every-other-time.html, otherwise, if preferred I will post everything here as well. Thanx a lot guys!
Paul_Hossler
08-17-2015, 06:13 AM
Suggest you post everything here
(and mention the MrExcel cross-post)
Juriemagic
08-24-2015, 06:00 AM
I have this code in a sheet (LOG) module:
Private Sub Worksheet_Activate()
Sheets("LOG").Protect
End Sub
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Sheets("LOG").Unprotect
Dim rCell As Range
Dim rChange As Range
Set rChange = Intersect(Target, Range("C:C"))
If Not rChange Is Nothing Then
Application.EnableEvents = False
For Each rCell In rChange
If rCell > "" Then
rCell.Offset(0, 1).Value = Environ$("UserName")
rCell.Offset(0, 2).Value = Date & " " & Time()
Else
'do nothing
End If
Next
End If
ExitHandler:
Set rCell = Nothing
Set rChange = Nothing
Application.EnableEvents = True
Exit Sub
ErrHandler:
MsgBox Err.Description
Resume ExitHandler
End Sub
Private Sub Worksheet_Deactivate()
Sheets("LOG").Unprotect
End Sub
and this code in a button on Sheet2 (UPDATE ROOM)
Sub LogChanges()
'
' LogChanges Macro
'
'
If ActiveSheet.Range("A1").Value = 1 Then Exit Sub
Application.ScreenUpdating = False
Dim copySheet As Worksheet
Dim pasteSheet As Worksheet
Set copySheet = Worksheets("Update Room")
Set pasteSheet = Worksheets("LOG")
copySheet.Unprotect
Range("A1").Value = 1
copySheet.Range("E3").Copy
pasteSheet.Cells(Rows.Count, 3).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues
Application.CutCopyMode = False
copySheet.Select
copySheet.Unprotect
Range("A1").Select
copySheet.Protect
pasteSheet.Protect
End Sub
Then this code in Sheet2 module:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("C3")) Is Nothing Then
ActiveSheet.Unprotect
ActiveSheet.Range("A1") = 2
If I select C3, A1 changes to a 2. When the button is clicked, the code runs by copying the value in E3 and then pasting that value in the LOG sheet in column 3 under the last entry. A1 is also simultaneously changed back to a 1. (The "2" enables the button while the "1" disables it). If I select C3 again, and click the button, I get an error. The next time it will work, and then not, then again, then not...Believe me I have spent this whole day searching, adapting but I cannot get this to work smoothly. I made a small sample workbook, but it was just too big to upload (21kb) on VBA Express. So I did not post there. Please anyone, all help will be accepted with great humility and humbleness. Thank you all kindly...
I posted this thread on MrExcel 10 days ago, and have not received any responses, so I'm trying here. The link is:http://www.mrexcel.com/forum/excel-questions/875686-code-works-every-other-time.html
Forget 'protecting' in Excel
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Sheets("LOG").cells(rows.count,3).end(xlup).offset(1).resize(,2)=array(environ(26),now)
End Sub
Juriemagic
08-25-2015, 01:29 AM
Hi snb,
Thank you very much for this help, just, I have stared myself blind at this to try and figure out where this must go in, also, must I delete some coding?..sorry for bugging you...
Look at the first line: rather obvious I'd say.
Put this code in the ThisWorkbook Module. IT will provide all the Protection that the Regular for of Protect does EXCEPT, the sheets are NOT protected from VBA Code.
Private Sub Workbook_Open()
For Each Sht In Me.Sheets
Sht.Protect UserInterfaceOnly:=True
Next Sht
End Sub
I don't know why you need to click twice to log the change, but I incorporated that process in this code.
Put this code in a standard Module and tie your button on sheet "Update Room" to it.
Sub LogChanges()
' For Help, see: "http://www.vbaexpress.com/forum/showthread.php?53494-Code-works-every-other-time"
''''''Double Check intent to Ubdate Log''''''''''
Dim Answer As Variant
Answer = MsgBox(Prompt:="Are you sure you want to update the log at this time?", _
Buttons:=vbYesNo)
If Answer = vbNo Then Exit Sub
'''''''End Block''''''''''''''''''''''''''''''''''
With Worksheets("LOG").Cells(Rows.Count, 3).End(xlUp).Offset(1, 0)
.Value = Worksheets("Update Room").Range("E3").Value
.Offset(0, 1).Value = Environ$("UserName")
.Offset(0, 2).Value = Now
End With
End Sub
Juriemagic
08-27-2015, 03:32 AM
SamT,
Thank you very much..your assistance is highly appreciated!..Have a good day...
HiGH_ZeRO
02-21-2018, 06:17 AM
Hello, I have the same problem with my macro, for some reason for very first time it creates the new sheets only with title row, but after I delete the wrong files and run it again - it works as should be.
Please advise me what is wrong with the code.
Option Explicit
Sub SPLIT_SHEETS()
Application.SheetsInNewWorkbook = 1
Dim key_col As Integer, wb_sh_split As Integer
Dim last_col_descr As String, rng_col_letter As String, sheet_name As String, del_col As String
If ActiveSheet.AutoFilterMode Then
If ActiveSheet.FilterMode Then
ActiveSheet.ShowAllData
Debug.Print ActiveWorkbook.name & ". " & ActiveSheet.name & ". Filter has been cleared"
End If
End If
last_col_descr = "Change Number"
del_col = "KEY"
Cells.Find(what:=last_col_descr, After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate
rng_col_letter = Split(ActiveCell(1).Address(1, 0), "$")(0)
Cells.Find(what:=del_col, After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate
key_col = ActiveCell.column
sheet_name = ActiveSheet.name
Debug.Print sheet_name; key_col
wb_sh_split = MsgBox("Do you want to split data to workbooks? Yes to workbooks, No to sheets", vbYesNoCancel, "Please make your choise.")
If wb_sh_split = vbYes Then
wb_sh_split = 1
Call create_subdir
ElseIf wb_sh_split = vbNo Then
wb_sh_split = 2
ElseIf wb_sh_split = vbCancel Then
Exit Sub
End If
Call SPLIT_SHEETS_CORE(rng_col_letter, sheet_name, del_col, key_col, wb_sh_split)
With Application
.Calculation = xlCalculationAutomatic
.EnableEvents = True
.ScreenUpdating = True
End With
ActiveWorkbook.Save
End Sub
Function SPLIT_SHEETS_CORE(rng_col_letter As String, sheet_name As String, del_column As String, vcol As Integer, wb_sh_split As Integer)
Dim icol As Long, lr As Long
Dim ws As Worksheet
Dim wb As Workbook
Dim dest_wb As Workbook
Dim titlerow As Long, i As Long
Dim myarr As Variant
Dim new_sh_name As String
Dim strdir As String, title As String
'vcol = 1 'vcol =1, the number 1 is the column number that you want to split the data based on.
strdir = ActiveWorkbook.Path & "\" & "Splitted" & "\"
Set ws = Sheets(sheet_name)
new_sh_name = "Consolidated_file"
lr = ws.Cells(ws.Rows.Count, vcol).End(xlUp).row
title = "A1:" & rng_col_letter & "1"
titlerow = ws.Range(title).Cells(1).row
icol = ws.Columns.Count
ws.Cells(1, icol) = "Unique"
For i = 2 To lr
On Error Resume Next
If ws.Cells(i, vcol) <> "" And Application.WorksheetFunction.Match(ws.Cells(i, vcol), ws.Columns(icol), 0) = 0 Then
ws.Cells(ws.Rows.Count, icol).End(xlUp).Offset(1) = ws.Cells(i, vcol)
End If
Next
myarr = Application.WorksheetFunction.Transpose(ws.Columns(icol).SpecialCells(xlCel lTypeConstants))
ws.Columns(icol).Clear
If wb_sh_split = 1 Then
For i = 2 To UBound(myarr)
ws.Range(title).AutoFilter field:=vcol, Criteria1:=myarr(i) & ""
If Not Evaluate("=ISREF('" & myarr(i) & "'!A1)") Then
Debug.Print "1"
With Workbooks.Add
With .Sheets.Add(Before:=.Sheets(1))
.name = new_sh_name
End With
End With
Application.DisplayAlerts = False
ActiveWorkbook.Worksheets("Sheet1").Delete
Application.DisplayAlerts = True
ActiveWorkbook.SaveAs Filename:=strdir & myarr(i) & ""
Else
Debug.Print "2"
With Workbooks.Add
With .Sheets.Add(After:=Worksheets(Worksheets.Count))
.name = new_sh_name
End With
End With
End If
DoEvents
ws.Range("A" & titlerow & ":A" & lr).EntireRow.Copy Sheets(new_sh_name).Range("A1")
Sheets(new_sh_name).Columns.AutoFit
Call match_and_delete(del_column)
ActiveWorkbook.Close SaveChanges:=True
Next
ElseIf wb_sh_split = 2 Then
For i = 2 To UBound(myarr)
ws.Range(title).AutoFilter field:=vcol, Criteria1:=myarr(i) & ""
If Not Evaluate("=ISREF('" & myarr(i) & "'!A1)") Then
Sheets.Add(After:=Worksheets(Worksheets.Count)).name = new_sh_name
Else
Sheets(new_sh_name).Move After:=Worksheets(Worksheets.Count)
End If
DoEvents
ws.Range("A" & titlerow & ":A" & lr).EntireRow.Copy Sheets(new_sh_name).Range("A1")
Sheets(new_sh_name).Columns.AutoFit
Next
End If
ws.AutoFilterMode = False
ws.Activate
End Function
Function create_subdir()
Dim strdir As String
strdir = ActiveWorkbook.Path & "\" & "Splitted" & "\"
If Dir(strdir, vbDirectory) = "" Then
MkDir strdir
Else
End If
End Function
Function match_and_delete(col_name As String)
Dim i As Integer
On Error GoTo ColumnNotExist
i = Application.WorksheetFunction.Match(col_name, Range("A1:AZ1"), 0)
If i > 0 Then
Debug.Print ActiveWorkbook.name & "Column number is " & i
Cells.Find(what:=col_name, After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Select
Selection.EntireColumn.Delete
Debug.Print ActiveWorkbook.name & ". Column (" & col_name & ") has been deleted."
End If
Exit Function
ColumnNotExist:
Debug.Print ActiveWorkbook.name & ". Column (" & col_name & ") does not exist and nothing has been done."
Err.Clear
End Function
Juriemagic
02-21-2018, 07:34 AM
Hello, I have the same problem with my macro, for some reason for very first time it creates the new sheets only with title row, but after I delete the wrong files and run it again - it works as should be.
Please advise me what is wrong with the code.
Option Explicit
Sub SPLIT_SHEETS()
Application.SheetsInNewWorkbook = 1
Dim key_col As Integer, wb_sh_split As Integer
Dim last_col_descr As String, rng_col_letter As String, sheet_name As String, del_col As String
If ActiveSheet.AutoFilterMode Then
If ActiveSheet.FilterMode Then
ActiveSheet.ShowAllData
Debug.Print ActiveWorkbook.name & ". " & ActiveSheet.name & ". Filter has been cleared"
End If
End If
last_col_descr = "Change Number"
del_col = "KEY"
Cells.Find(what:=last_col_descr, After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate
rng_col_letter = Split(ActiveCell(1).Address(1, 0), "$")(0)
Cells.Find(what:=del_col, After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate
key_col = ActiveCell.column
sheet_name = ActiveSheet.name
Debug.Print sheet_name; key_col
wb_sh_split = MsgBox("Do you want to split data to workbooks? Yes to workbooks, No to sheets", vbYesNoCancel, "Please make your choise.")
If wb_sh_split = vbYes Then
wb_sh_split = 1
Call create_subdir
ElseIf wb_sh_split = vbNo Then
wb_sh_split = 2
ElseIf wb_sh_split = vbCancel Then
Exit Sub
End If
Call SPLIT_SHEETS_CORE(rng_col_letter, sheet_name, del_col, key_col, wb_sh_split)
With Application
.Calculation = xlCalculationAutomatic
.EnableEvents = True
.ScreenUpdating = True
End With
ActiveWorkbook.Save
End Sub
Function SPLIT_SHEETS_CORE(rng_col_letter As String, sheet_name As String, del_column As String, vcol As Integer, wb_sh_split As Integer)
Dim icol As Long, lr As Long
Dim ws As Worksheet
Dim wb As Workbook
Dim dest_wb As Workbook
Dim titlerow As Long, i As Long
Dim myarr As Variant
Dim new_sh_name As String
Dim strdir As String, title As String
'vcol = 1 'vcol =1, the number 1 is the column number that you want to split the data based on.
strdir = ActiveWorkbook.Path & "\" & "Splitted" & "\"
Set ws = Sheets(sheet_name)
new_sh_name = "Consolidated_file"
lr = ws.Cells(ws.Rows.Count, vcol).End(xlUp).row
title = "A1:" & rng_col_letter & "1"
titlerow = ws.Range(title).Cells(1).row
icol = ws.Columns.Count
ws.Cells(1, icol) = "Unique"
For i = 2 To lr
On Error Resume Next
If ws.Cells(i, vcol) <> "" And Application.WorksheetFunction.Match(ws.Cells(i, vcol), ws.Columns(icol), 0) = 0 Then
ws.Cells(ws.Rows.Count, icol).End(xlUp).Offset(1) = ws.Cells(i, vcol)
End If
Next
myarr = Application.WorksheetFunction.Transpose(ws.Columns(icol).SpecialCells(xlCel lTypeConstants))
ws.Columns(icol).Clear
If wb_sh_split = 1 Then
For i = 2 To UBound(myarr)
ws.Range(title).AutoFilter field:=vcol, Criteria1:=myarr(i) & ""
If Not Evaluate("=ISREF('" & myarr(i) & "'!A1)") Then
Debug.Print "1"
With Workbooks.Add
With .Sheets.Add(Before:=.Sheets(1))
.name = new_sh_name
End With
End With
Application.DisplayAlerts = False
ActiveWorkbook.Worksheets("Sheet1").Delete
Application.DisplayAlerts = True
ActiveWorkbook.SaveAs Filename:=strdir & myarr(i) & ""
Else
Debug.Print "2"
With Workbooks.Add
With .Sheets.Add(After:=Worksheets(Worksheets.Count))
.name = new_sh_name
End With
End With
End If
DoEvents
ws.Range("A" & titlerow & ":A" & lr).EntireRow.Copy Sheets(new_sh_name).Range("A1")
Sheets(new_sh_name).Columns.AutoFit
Call match_and_delete(del_column)
ActiveWorkbook.Close SaveChanges:=True
Next
ElseIf wb_sh_split = 2 Then
For i = 2 To UBound(myarr)
ws.Range(title).AutoFilter field:=vcol, Criteria1:=myarr(i) & ""
If Not Evaluate("=ISREF('" & myarr(i) & "'!A1)") Then
Sheets.Add(After:=Worksheets(Worksheets.Count)).name = new_sh_name
Else
Sheets(new_sh_name).Move After:=Worksheets(Worksheets.Count)
End If
DoEvents
ws.Range("A" & titlerow & ":A" & lr).EntireRow.Copy Sheets(new_sh_name).Range("A1")
Sheets(new_sh_name).Columns.AutoFit
Next
End If
ws.AutoFilterMode = False
ws.Activate
End Function
Function create_subdir()
Dim strdir As String
strdir = ActiveWorkbook.Path & "\" & "Splitted" & "\"
If Dir(strdir, vbDirectory) = "" Then
MkDir strdir
Else
End If
End Function
Function match_and_delete(col_name As String)
Dim i As Integer
On Error GoTo ColumnNotExist
i = Application.WorksheetFunction.Match(col_name, Range("A1:AZ1"), 0)
If i > 0 Then
Debug.Print ActiveWorkbook.name & "Column number is " & i
Cells.Find(what:=col_name, After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Select
Selection.EntireColumn.Delete
Debug.Print ActiveWorkbook.name & ". Column (" & col_name & ") has been deleted."
End If
Exit Function
ColumnNotExist:
Debug.Print ActiveWorkbook.name & ". Column (" & col_name & ") does not exist and nothing has been done."
Err.Clear
End Function
Hello High ZEro,
unfortunately I am too stupid to help with this, as I was the one who was helped then. I suggest you rather start a new thread, that way the good okes will look at it. This thread had been closed..
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.