Page 1 of 2 12 LastLast
Results 1 to 10 of 20

Thread: HTML Code Test --post8798

  1. #1
    Fuhrer, Vierte Reich DocAElstein's Avatar
    Join Date
    Aug 2014
    Posts
    9,270
    Rep Power
    10

    HTML Code Test --post8798

    Code:
    ' Slightly modified with lots of Comments
    Sub RickRothsteinsConcatenatingBalls()
    'NOTE: Change the ## A1 to the address of the top left cell of your
    'existing data and change the '### G1 to the address of the top left cell where you want the converted table to go to.
    **Const ExistingTableAnyCellLocation As String = "A1" '##
    **Const NewTableLHCornerLocation As String = "G1" '###
    **
    **Dim SourceTableRange As Range 'Give a name and allow all methods and properties of range object to it
    **Set SourceTableRange = Range(ExistingTableAnyCellLocation).CurrentRegion ' Give this a specific Range. CurrentRegiuon Property applied to a cell returns a complete range incorporating that cell and any ranges that it either is in or touches
    **Dim SourceTableRangeTableRowsCount As Byte ' For a small Table allow it to hve up to 255 Rows
    **Let SourceTableRangeTableRowsCount = SourceTableRange.Rows.Count ' This returns the number of rows in the original table
    
    **Dim FinalTableFirstColumnRange As Range
    **Set FinalTableFirstColumnRange = Range(NewTableLHCornerLocation).Resize(SourceTableRangeTableRowsCount) ' Here the resize Property applied to the Range G1 (or Cell G1 here) returns a range increased by the row number, that is to say a range equal to the first column
    **
    **SourceTableRange.Columns(1).Resize(, 2).Copy Destination:=FinalTableFirstColumnRange ' This is one way of copying the first two columns of the original table to The final table
    **FinalTableFirstColumnRange.Columns(2).NumberFormat = "@" ' This gives a format to the second column in the final Table
    **
    **'FinalTableFirstColumnRange.Offset(0, 1) = _
    **'Evaluate("IF(ROW()," & SourceTableRange.Columns(2).Address & "&"" - ""&" & SourceTableRange.Columns(3).Address & "&"" - ""&" & SourceTableRange.Columns(4).Address & ")")
    **'FinalTableFirstColumnRange.Offset(0, 1) = _
    **'Evaluate("** " & SourceTableRange.Columns(2).Address & "&"" - ""&" & SourceTableRange.Columns(3).Address & "&"" - ""&" & SourceTableRange.Columns(4).Address & "")
    ** FinalTableFirstColumnRange.Offset(0, 1) = _
    ****************Evaluate("** " & SourceTableRange.Columns(2).Address & "**** " & "&"" - ""&" & " " & SourceTableRange.Columns(3).Address & "**" & "&"" - ""&" & "" & SourceTableRange.Columns(4).Address & "")
    **
    **SourceTableRange.Columns(5).Copy Destination:=FinalTableFirstColumnRange.Offset(, 2) 'Column 5 of Original table is copied to column 3 of the Final table by setting the destination to 2 colums offset from the first column
    **
    **FinalTableFirstColumnRange.Cells(1, 0).Offset(0, 1).Value = "Numbers" ' The current heading in the second column is finally overwriten with "Numbers".**This is done here by putting the value"Numbers" in the cell which is offset by 1 column to the first cell in the Final Table First Column
    End Sub 'RickRothsteinsConcatenatingBalls()
    '

    https://www.youtube.com/channel/UCnxwq2aGJRbjOo_MO54oaHA
    https://www.youtube.com/watch?v=SIDLFRkUEIo&lc=UgzTF5vvB67Zbfs9qvx4AaABAg
    https://www.youtube.com/watch?v=v_1iqtOnUMg&lc=UgxLtKj969oiIu7zNb94AaABAg
    https://www.youtube.com/watch?v=f7xZivqLZxc&lc=Ugxq4JHRza_zx3sz0fx4AaABAg
    https://www.youtube.com/watch?v=f7xZivqLZxc&lc=Ugxq4JHRza_zx3sz0fx4AaABAg
    https://www.youtube.com/watch?v=f7xZivqLZxc&lc=UgzMCQUIQgrbec400jl4AaABAg
    https://www.youtube.com/watch?v=LuAipOW8BNQ&lc=Ugz0Uy2bCSCTb1W-0_14AaABAg
    https://www.youtube.com/watch?v=ITI1HaFeq_g&lc=Ugx12mI-a39T41NaZ8F4AaABAg.9iDQqIP56NV9iFD0AkeeJG
    https://www.youtube.com/watch?v=vXyMScSbhk4&lc=Ugxa2VYHMWJWXA6QI294AaABAg.9irLgSdeU3r9itU7zdnW Hw
    https://www.youtube.com/watch?v=tPRv-ATUBe4&lc=UgzFkoI0n_BxwnwVMcZ4AaABAg
    https://www.youtube.com/watch?v=LuAipOW8BNQ&lc=Ugz0Uy2bCSCTb1W-0_14AaABAg.9htChVuaX9W9htG01cKBzX
    https://www.youtube.com/watch?v=LuAipOW8BNQ&lc=Ugw6UrV69zpeKvLOeOV4AaABAg.9ht16tzryC49htJ6TpIO XR
    https://www.youtube.com/watch?v=LuAipOW8BNQ&lc=UgwMKwGZpDjv7vi7pCx4AaABAg
    https://www.youtube.com/watch?v=LuAipOW8BNQ&lc=Ugw6UrV69zpeKvLOeOV4AaABAg.9ht16tzryC49htOKs4jh 3M
    https://www.youtube.com/watch?v=LuAipOW8BNQ&lc=UgxVW-am20rQ5GFuJ9F4AaABAg
    https://www.youtube.com/channel/UCnxwq2aGJRbjOo_MO54oaHA
    Last edited by DocAElstein; 10-24-2023 at 03:02 PM. Reason: Added Code Tags

  2. #2
    Administrator Excel Fox's Avatar
    Join Date
    Mar 2011
    Posts
    1,401
    Rep Power
    10
    DocAElstein, to add a VBA code, you can use the code tags button in the editor, or just type the tags. so use [Code]....[|Code], [PHP].....[|PHP], [HTML]....[|HTML]etc... (replace the | with /)
    A dream is not something you see when you are asleep, but something you strive for when you are awake.

    It's usually a bad idea to say that something can't be done.

    The difference between dream and aim, is that one requires soundless sleep to see and the other requires sleepless efforts to achieve

    Join us at Facebook

  3. #3
    Fuhrer, Vierte Reich DocAElstein's Avatar
    Join Date
    Aug 2014
    Posts
    9,270
    Rep Power
    10
    Quote Originally Posted by Excel Fox View Post
    DocAElstein, to add a VBA code, you can use the code tags button in the editor, or just type the tags. so use [Code]....[|Code], [PHP].....[|PHP], [HTML]....[|HTML]etc... (replace the | with /)
    Hi Thanks for Reply. Yeah with CODE TAGS I am familiar
    Hi Fox
    . Thanks for Reply. Yeah with CODE TAGS I am familiar. I have never seen them retaining the color format as you have them above. I am not sure how to achieve that in the practice without first posting a code in HTML format in a thread (as I did for the above code) and then copying That to the next Thread and putting it in code tags??? In the other forum everything in the code tags is Black/White regardless of the original format.

    . There are a lot of tricky formatting problems with a typical Forums Editor, as I noticed in the other Forum I am in.

    . With my last thread I had problems and could not get my HTML made table to come up, (so I posted a file over Filesnack as a "Plan B").

    . I have an interesting reply to my last (First and Only here) thread. But I think I must now spend some time experimenting with the editor. I assume that is OK?

  4. #4
    Fuhrer, Vierte Reich DocAElstein's Avatar
    Join Date
    Aug 2014
    Posts
    9,270
    Rep Power
    10

    Named Ranges and Named Ranges scope. Referencing a named

    Code:
    Dim ilSanityCheck As Integer
    Dim llEndLine As Long
    
    Set olPane = Application.VBE.ActiveCodePane
    olPane.GetSelection Startline:=llSRow, startcolumn:=llSCol, Endline:=llERow, Endcolumn:=llECol
    
    slProcName = olPane.CodeModule.ProcOfLine(llSRow, vbext_pk_Proc)
    llLine1 = olPane.CodeModule.ProcBodyLine(slProcName, vbext_pk_Proc)
    llCountLines = olPane.CodeModule.ProcCountLines(slProcName, vbext_pk_Proc)
    llStartLine = olPane.CodeModule.ProcStartLine(slProcName, vbext_pk_Proc)
    llEndLine = llStartLine + llCountLines - 1
    
    ' Find Dim Line.
    llCompLine1 = llLine1
    
    Do
      slOLine1 = Trim$(olPane.CodeModule.Lines(llCompLine1, 1))
      
      If Left$(slOLine1, 4) = "Dim " Then
        Exit Do
      ElseIf Left$(slOLine1, 6) = "Const " Then
    Last edited by DocAElstein; 02-01-2019 at 02:47 AM.

  5. #5
    Fuhrer, Vierte Reich DocAElstein's Avatar
    Join Date
    Aug 2014
    Posts
    9,270
    Rep Power
    10
    "What’s in a String"- VBA break down Loop through character contents of a string

    __Hello (or _ vbTab & “He” & “l” & “l” & “o” & vbCr & vbLf _ )
    In VBA coding and probably a lot of things to do with computers what is “actually” there is a long string of “characters” . These “characters” can be what we may recognise as every day characters, like H e l l o , as well as other things which technically still go be the name of characters. Some times these other characters may be referred to as hidden characters. In this usage of the word, hidden is not really an official term, but more of an everyday term used to mean some characters in the string that in many systems which we use to “view” strings, those characters are not obvious to see to us Humans

    Check what ya got in ya string
    I have found it can be interesting, informing and occasionally essential, to know what I have in a string. This can be done very easily in VBA with a simple loop. In the simplest form you need to use just two simple VBA functions , one, Len , to initially get the character length so that you know how many times to loop. In the Loop you use a second function, Mid , to get at each character.

    In most practical situations you will have to get the string that you want to actually look at by some means that may not be straight forward. Exactly how you do that may vary from time to time, so it is usually convenient to write a routine which will work on some string which you present it. That routine will be a Sub routine which is written to take in a string, or string variable with a string in it.

    So as example we will make a routine with first (signature) line of, say
    Sub LoopThroughString(ByVal MyString As String)
    So we have a routin like
    Code:
    Sub LoopThroughString(ByVal MyString As String)
    
    
    
    End Sub
    The first ( signature ) line means that that routine will work from within another routine as a sort of a method, which when you Call it in to use, will need to be given some string value . You are allowed to pass it a variable containing a string variable as well, if you prefer: The signature line specifies that it will take the Value of that

    For the purposes of this demo we will first need to have a simple routine that Calls the main routine, Sub LoopThroughString( ByVal MyString [color=Blue]As String[/color] )
    It is that simple routine that we will run in our demos. You have to do that, because you cannot easily run a code such as Sub LoopThroughString( ByVal MyString [color=Blue]As String[/color] ) . VBA syntax simply does not allow you to do that easily. The simplest way to get it to run is to Call it from a simple routine which must at the Call line pass the string that I want to look at.
    Either of the 4 Calling lines in the next routine are syntaxly satisfactory . So running the routine Sub MyTestString() will result in the routine FONT=Courier New] Sub LoopThroughString( ByVal MyString [color=Blue]As String[/color] ) [/FONT] running 8 times: You will get the pop up message box 8 times :
    StringInfoMsgBox.JPG : https://imgur.com/cWG7z5s
    Code:
    Sub MyTestString()
     Call LoopThroughString(MyString:="Hello")
     LoopThroughString MyString:="Hello"
     Call LoopThroughString("Hello")
     LoopThroughString "Hello"
    ' In the practice we would likely have our string obtained from some mehtod and would have it held in some string variable
    Dim varForMyString As String
     Let varForMyString = "Hello"
     Call LoopThroughString(MyString:=varForMyString)
     LoopThroughString MyString:=varForMyString
     Call LoopThroughString(varForMyString)
     LoopThroughString varForMyString
    End Sub
    Sub LoopThroughString(ByVal MyString As String)
     MsgBox prompt:="You did pass" & vbCr & vbLf & "  the following string: " & vbCr & vbLf & vbTab & """" & MyString & """", Buttons:=vbInformation, Title:="Info about the string you gave me"
    End Sub
    I personally prefer the syntax form which helps remind me what is going on, and so I would reduce the demo coding to Call the main routine, Sub LoopThroughString( ByVal MyString [color=Blue]As String[/color] ) , just once and supply it the string under investigation within a variable:
    Code:
    Sub MyTestString()
    ' In the practice we would likely have our string obtained from some method and would have it held in some string variable
    Dim varForMyString As String
     Let varForMyString = "Hello"
     Call LoopThroughString(MyString:=varForMyString)
    End Sub
    
    Sub LoopThroughString(ByVal MyString As String)
     MsgBox prompt:="You did pass" & vbCr & vbLf & "  the following string: " & vbCr & vbLf & vbTab & """" & MyString & """", Buttons:=vbInformation, Title:="Info about the string you gave me"
    End Sub
    In that coding the various & vbCr & vbLf & vbTab & """" stiff is just to pretty up the format a bit and to make us aware of some of the most common hidden characters.
    This shortened version might be more familiar to a complete beginner:
    Code:
    Sub MyTestString()
    Dim varForMyString As String
     Let varForMyString = "Hello"
     LoopThroughString varForMyString
    End Sub
    
    Sub LoopThroughString(ByVal MyString As String)
     MsgBox MyString
    End Sub
    vbTab vbCr vbLf """"
    I have not mentioned it yet, it may have been obvious, but just in case not.. The first three things there are the most common used “hidden characters” and so are really worth with getting familiar with if you are interested in looking at contents of a string. Also the way we handle quotes in a string is very awkward leading often to problems, so it is really worth getting a feel for that at an early stage.
    vbCr vbLf
    These come about the early days of computing. Back then strings and other things in strings passing around computers and the early days of the internet tended to find there way fed into a mechanical printer of mechanical typewriter which had paper fed into it Cr means something along the lines of carriage return which in turn means go back to the start. Usually this start means the left side of a piece of paper . You would need to do that if you are typing out along a piece of paper as eventually you would get to the other side of the paper. Almost always when you did a Cr you would need to move the piece of paper by a bit more than the height of a line so that the next printing did not go on top of thee last line printed. Typically the word “LlineFeed” was used for this process of shifting the paper, hence the Lf abbreviation
    So those “hidden characters” would have been recognised by an old printer as telling it to move to a new line and go back to the start side of the paper before printing further. As coding and screens and word processing developed, those two hidden characters were the natural things to keep using to indicate a new line on what ever media we “look at” computer stuff. There are two characters there. Often in coding you can use something like vbCrLf instead. But that is still “seen” as 2 characters by most computer things: it will almost always be measured to have a Length of 2. Some computer systems will recognise it as vbCrLf. Others will “see” it as vbCr & vbLf
    vbTab
    This can be a bit inconsistent. Or rather, the results it gives can be very dependant on various computer settings, so that can make it tricky to use effectively. The simplest explanation is a space. More specifically it can be use to define a specific place where something my begin. In some situations an argument version is available vbTab( ) to define specifically “where something may be”. Exactly how it works can be a bit variable.

    Important uses of vbTab vbCr vbLf
    In computing generally the use of vbCr & vbLf will signalise a display window or text file or similar to separate a string into lines. For modern uses there often is not the requirement to have the two and it would appear that in most cases either of these 3 will result in a new line being displayed.
    vbCr & vbLf
    vbCr
    vbLf

    In some situations Excel will use vbCr & vbLf to separate rows. It appears that within a cell it usually just uses vbLf
    In some situations Excel will use the vbTab
    These uses of vbTab vbCr vbLf allow for some interesting alternative ways to manipulate ranges





    These are the 3 situations I think, and the returned docx has three statements that I think summarise them

    Scenario (i) https://imgur.com/k9hJhFG
    If no line continuations are present and there is a one or more blank lines, then the line before the first blank line down from the upper routine is taken as the break point.

    Scenario (ii) https://imgur.com/6yexJo2
    Scenario( ii) https://imgur.com/C20dep7
    Scenario (ii) https://imgur.com/CVqUwRC
    If there are one or more line continuations present then the break point will be placed at the first blank line down after the last line after the line continuation … unless scenario (iii)

    Scenario (iii) https://imgur.com/zkvMkBB
    Scenario (iii) https://imgur.com/9ekvwCn
    there are no blank lines after the first line looking down after the last line continuation looking down. In this case, the break is at the line after the line continuation




    Code:
    above
    left
    Insideright under


    [CODE]

    End Sub ' The dividing line appears to us as a line of underscores ____



    Code:
    Sub Scenario_0()
    ' _(0)
    End Sub
    
    Sub senario_0() ' _(0) End Sub '
    ' ' Sub surnario_0() ' _(0) End Sub
    Last edited by DocAElstein; 02-05-2019 at 07:26 PM.

  6. #6
    Fuhrer, Vierte Reich DocAElstein's Avatar
    Join Date
    Aug 2014
    Posts
    9,270
    Rep Power
    10
    Positioning of procedure separation in the Visual Basic Development Environment

    These are some notes based on a discussion here.. http://www.eileenslounge.com/viewtopic.php?f=30&t=31756
    It appears that in VBA, that is to say in the Visual Basic Development Environment Window , ( that window seen by hitting Alt+F11 from a spreadsheet ) , the convention has been set to separate procedures by a line extending across the code pane Window.
    We see these as appearing as a series of underscores, __________________ , extending across the Visual Basic Development Environment Window
    Code:
    End Sub  '  The dividing line appears to us as a line of underscores ____ 
    



    Usually, if we did write exactly this ' The dividing line appears to us as a line of underscores ____ ' , on that terminating line , then we would not see those underscores, ____
    Hidden_____InDividingLine.JPG : https://imgur.com/7DyP9Om

    Between procedures we may add blank lines or ' comment lines. If this is done, It appears that the convention has been set to place the line somewhere between the procedures in this blank/ comment range, and the lines above the line “belong” to the procedure above, that is to say the last or preeceding procedure, and the lines below the line “belong” to the procedure below, that is to say the next procedure, http://www.eileenslounge.com/viewtop...=31756#p245845

    The documentation is not 100% clear on how the position of the dividing is determined , that is to say how the row on which it physically appears as a long series of underscores, __________________ is determined
    There is no obvious logic to the way in which the dividing line can be positioned, that is to say , how to determine on which the dividing line appears as a long series of underscores, __________________

    Some initial experiments suggest that is influenced by positioning of blank lines and any single underscores _
    We not in passing , that single underscores are used in coding generally to allow us to divide a single line of code into several lines for ease of reading. For example:
    Code:
    ' http://www.excelfox.com/forum/showthread.php/2293-Move-values-in-rows-at-the-end-of-the-preceding-row-*SOLVED*?p=10891#post10891
    Sub LineContunuationUnderscores() ' https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/program-structure/how-to-break-and-combine-statements-in-code
      Dim LastRow As Long
      LastRow = Cells(Rows.Count, "A").End(xlUp).Row
      ' Without line breaks
      Range("A1:A" & LastRow) = Evaluate(Replace(Replace("IF(ISNUMBER(0+SUBSTITUTE(SUBSTITUTE(A2:A#,"" "",""""),"","","""")),IF(LEFT(A1:A@,4)=""2018"",TRIM(A1:A@&"" ""&A2:A#),""""),IF(LEFT(A1:A@,4)=""2018"",A1:A@,""""))", "#", LastRow + 1), "@", LastRow))
      ' With Line breaks
      LastRow = _
         Cells(Rows.Count, "A").End(xlUp).Row
      Range("A1:A" & LastRow) = Evaluate(Replace(Replace(  _
                                "IF(ISNUMBER(0+SUBSTITUTE(SUBSTITUTE(" &  _
                                "A2:A#,"" "",""""),"","","""")),IF(LEFT(A1:A@,4)" & _
                                "=""2018"",TRIM(A1:A@&"" ""&A2:A#),"""")," &  _
                                "IF(LEFT(A1:A@,4)=""2018"",A1:A@,""""))", "#", _
                                LastRow + 1), "@", LastRow))
    '  This is _
         acceptable in _
    or out of a  procedure
    End Sub
    '  This is _
         acceptable in _
    or out of a  procedure
    Further, we note that the line continuation , sometimes called a line break, _ , also applies to comments whether in a procedure or between procedures:
    ' This is _
    acceptable in _
    or out of a procedure


    _._________

    Determining position of horizontal line dividing procedures when blank or comment lines are between procedures.
    The documentation is not 100% clear on how the position of the dividing is determined , that is to say how the row on which it physically appears as a long series of underscores, __________________ is determined
    There is no obvious logic to the way in which the dividing line can be positioned, that is to say , how to determine on which the dividing line appears as a long series of underscores, __________________
    Some initial experiments suggest that is influenced by positioning of blank lines and any single underscores _
    There appear to be 3 scenarios to consider in order to place the line somewhere in between, ( 4 if you consider the simple case of all lines containing comments or all lines being blank )
    ' _(0)
    If all lines are blank, or all lines are full with comments ( which exclude line continuations )
    No underscores in any line
    The break is immediately after the upper procedure.
    Scenario 0 .JPG : https://imgur.com/pA4grFL
    Code:
    Sub Scenario_0()
    ' _(0)
    End Sub___________________________________________________________________________________________________________________________________________________________________________________________________________
    
    
     Sub senario_0()
    ' _(0)
    End Sub_____________________________________________________________________________________________________________________________________________________________________________________________________________________
    '
    '
    '
    Sub surnario_0()
    ' _(0)
    End Sub_____________________________________________________________________________________________________________________________________________________________________________________________________________________________
    Last edited by DocAElstein; 02-05-2019 at 07:51 PM.

  7. #7
    Fuhrer, Vierte Reich DocAElstein's Avatar
    Join Date
    Aug 2014
    Posts
    9,270
    Rep Power
    10
    Further Practice with using named ranges
    .

    Codes accompanying the notes in this post can be found here:


    There two main routines , and a few Called routines
    There are three files.
    The main file, “MasturFile.xlsm” , has all the codes in it. You need that file open when running the codes.
    The other files, “Data1.xls” and “Data2.xlsx” are intended to be data files which normally would be closed in normal use as a data file, for example when looking for or retrieving data. ( They will be opened temporarily by the main code when needed for named range work associated with the demos )

    The data files look like this, a header and some data

    “Data1.xls”
    Row\Col
    A
    B
    C
    D
    4
    5
    Food Kcal
    6
    Orange
    50
    7
    Apfel
    60
    8
    Worksheet: Tabelle1

    “Data2.xlsx”
    Row\Col
    A
    B
    C
    D
    8
    9
    10
    Suppliment Kcal
    11
    BCAA
    398
    12
    EAA
    400
    13
    Worksheet: Tabelle1

    The main File looks like this initially:
    MasturFile.xlsm
    Row\Col
    A
    B
    C
    D
    3
    4
    Nutrition Energy
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Worksheet: Tabelle1

    Here are the files at a file share site:
    “MasturFile.xlsm” :
    “Data1.xls” :
    “Data2.xlsx” :
    You should download them all into the same folder. To run the demo code , you only need to open “MasturFile.xlsm” and run the main routine, Sub FoxyNamedRanges()

    The demo will involve making some named ranges, and incorporating them into code lines to bring in the data from data files ( with them closed )

    The simplified form of what we will be considering is, as example, considering our brief introduction sketches from the first post, we would start with putting some string formula into a cell, which , without named ranges would be like writing in cell B5
    “=B2”
    Using named ranges this would look something like
    “=Name3”

    We will do this writing in of the formula in VBA, with a code line like, simplified,
    Range(“=C5”) = ”=Name3”

    We will extend this VBA approach to investigate using named ranges in the complete coding, like, simplified
    Range(“=myNameforB5”).Value = ”=Name3”

    Considerations of variations of the right hand side of that formula are similar to those for writing a formula manually in a cell.



    General notes to code:
    Called routine Sub GeTchaNms(ByVal CodLn As Long, ByVal WnkBuk As Workbook)
    This routine is used at various points in the main code to check the current situation regarding named range objects. For convenience it goes through the Workbook named objects collection object for a workbook, as this has “its own” named range objects, that is to say the Workbooks scoped named range objects, and also the named range objects for all the worksheets. So I do not need to go through the named range objects collection object of every worksheet in that workbook separately for every worksheet.
    To determine if a name is workbook scoped or worksheet scoped…
    We remember that Excel adds a bit onto the name we give to a name Added to a Worksheet’s named objects collection ( Add name object to a Worksheet’s named objects collection = worksheet “scoping” ). That added bit is something like “Sheet1!” . In other words, if you had given Name:=”MyName” in a code line for a worksheets scope Named range object Addition, like, …_
    Worksheets("Sheet2").Names.Add Name:="FoodHeader", RefersTo:=____
    _.. then after we do that, Excel seems to hold and use a name like “Sheet2!FoodHeader"
    So, for example , in the Adding code line above you use , _ Worksheets("Sheet2").Names.Add Name:="FoodHeader" , RefersTo:=___ _ , but we find that if we then use the Name property to return that string name like : …_
    = Worksheets(“Sheet2”).Names(“FoodHeader").Name
    -.. then we will be returned a string like
    “Sheet2!FoodHeader"
    The routine uses a check for that “!” in the returned .Name string in order to determine If the name object is worksheet scoped, Else the name object is assumed to be Workbooks scoped named object

    The routine then builds up a string with text information about that named range. That string is then given in a message box. ( Additionally, the information is printed to the Immediate window. If you are in the VB Editor and Hit Ctrl + g , then you will see this window. You may be able to drag that window to a convenient place where you can enlarge it. You can then copy all or some of this information. This is useful, for example, to get the correct reference path syntaxes. Note also, you are less limited for space in the immediate window, compared to the message box window )



    Using a named range
    A major part of my discussion in this Thread has discussed the scoping issue, which in simple terms, we have found determines where you can “get away with” using a simple =MyRangedname or MyRangedName in a spreadsheet cell or in a code part such as Range(“___”) , like Range(“MyRangedName”) or Range(“=MyRangedName”) . By “Get away with” we mean that Excel will guess correct what it adds to make a full path reference string to find the information it needs about that named range, such as where the range is that it Refers To. What clearly Excel seems to do is to go to the Names Object collection where we Added the Name object. This is what the phrase “scoping to” means in the case of named ranges:

    Worksheet Scope:
    We scoped to the Names object of a particular Worksheet = We Added the named range Name object to the names objects collection object of that particular Worksheet = We scoped that named range to that Worksheet = That named range has Worksheet Scope

    So in a practical Example, let me say I want to scope to Sheet1 ( Sheet1 is , say , in a file , “MyWorkbook.xls” )
    To Scope MyWshtScp to Sheet1 is done like this in code:
    __ Sheet1.Names.Add _ Name:=”MyWshtScp” ,_ Refers To:=some range somewhere
    After doing this creating/Adding of the named range, If I then use MyWshtScp anywhere in Excel, then Excel will not use that but will increase the string reference that it uses so as to get to the appropriate worksheet, after which the use of the MyWshtScp will be recognised as a name object “held” there in the Names objects collection object of Sheet1. So Excel will actually use something like this
    "'C:\MyFolder\MySubFolder\[MyWorkbook.xls]Sheet1'!MyWShtScp"
    As that is effectively the so called “Implicit default” , then I am free to use either that or just MyWShtScp interchangeably

    Workbook Scope:
    We scoped to the Names object of a particular Workbook = We Added the named range Name object to the names objects collection object of that particular Workbook = We scoped that named range to that Workbook = That named range has Workbook Scope

    So in a practical Example, let me say I want to workbook scope to a file , “MyWorkbook.xls”
    To Scope MyWkBookScp to MyWorkbook.xls is done like this in code:
    __ Workbooks(“MyWorkbook.xls”).Names.Add _ Name:=”MyWkBookScp” ,_ Refers To:=some range somewhere
    After doing this creating/Adding of the named range, If I then use MyWKBookScp anywhere in Excel, then Excel will not use that but will increase the string reference that it uses so as to get to the appropriate workbook ( MyWorkbook.xls ) , after which the use of the MyWkBookScp will be recognised as a name object “held” there in the Names objects collection object of MyWorkbook.xls. So Excel will actually use something like this
    "'C:\MyFolder\MySubFolder\[MyWorkbook.xls]'!MyWkBookScp"
    As that is effectively the so called “Implicit default” , then I am free to use either that or just MyWShtScp interchangeably
    (Note that Excel seems to accept also for a workbook scoped named range an alternative full string reference to any of the worksheets in that workbook, So for example, if I my second worksheet had the name Sheet2 , then this would also be accepted:
    "'C:\MyFolder\MySubFolder\[MyWorkbook.xls]Sheet2'!MyWkBookScp" )

    The reason I have just explained that last bit about the “implied” default full references, is that I personally prefer to use them, and so have done so throughout the coding


    The next post describes the main demo codes in detail.
    Last edited by DocAElstein; 11-16-2018 at 12:26 AM.

  8. #8
    Fuhrer, Vierte Reich DocAElstein's Avatar
    Join Date
    Aug 2014
    Posts
    9,270
    Rep Power
    10
    Main codes
    - Initially a single cell will be named. The use of the named range is fairly straight forward for this. When using a named range for a multiple call range, there can be some difficulties due to some restrictions caused by being forced into referencing the entire range. The use of Array formula entry , ( the , ( “the CSE stuff” ) will sometimes need to be used, so as an aside this will be revised before going on to multi cell named ranges in the second main code




    Main Code, Sub FoxySingleCellNamedRanges()
    The code deals principally with named ranges referring to single cells.

    '0b) This section is not specifically to do with named ranges, but concerns my personal preference to use a full reference. As mentioned in the introduction first post, this is generally a good practice to make sure the correct cell is referenced at any time or code part. In addition, as we will also be considering named ranges in closed workbooks, it is useful to have the full reference stored in a string variable.
    We find that VBA generally will accept that variable containing the complete reference in most situations where it only needs part of it, so it rarely does any harm to “give too much” in any cell reference.
    It is my belief that VBA itself converts all cell references internally to the full form before it uses them. So if we always give the full reference we want, then that avoids annoying problems that often catch you out unawares, for example, when Excel guesses wrong the full path that it then uses: If you give the full path, then Excel takes that , and makes no attempt to replace any parts: it makes no attempt to guess anything if you give the full path.
    So code section '-1b) just gives us some variables to hold a full reference string which we will use in places where we might need any of these variations for a cell reference, say B5:
    B5
    Sheet7!B5
    [myWorkbook.xlsm]Sheet4!B5
    'G:\Desktop\MyFolder\[DataFile.xlsx]Tabelle1'!B5

    The last one is the form we hold in the variables. As noted, Excel and Excel VBA , usually has no issues if you use the full reference in situations where one of the shorter versions may have been sufficient. But on the other hand, you may get unexpected problems if you used a shorter version , and Excel then guesses wrongly for the remaining part, which I believe it always adds internally, ( possibly at some compiling stage ) , before it uses it.


    Rem _1 Data1 Food header, ( value “Food” from first data file screenshot ) , as a named range
    So here we looked at the right hand side of the basic code line of, simplified,
    Range(“B5”).Value = “ = myNamedRange “
    This is very similar to investigating manual uses of named ranges, that it to say, typing things like …_
    “ = myNamedRange “
    _... in a spreadsheet cell: That simple code line basically writes the string in the cell , as a person would do manually.

    The practical example considered here is to write a simple formula in the main workbook, that will bring in the “Food” heading name cell, B5, from the data file, “data1.xls” into B5 in the main workbook.

    The simplified form of this would be , without named ranges
    Range(“B5”).Value = “ = [data1.xls]Tabelle1!B5 “
    Using a named range for the range in the data1 workbook, say “Dta1Foodheader1” , then this would be like
    Range(“B5”).Value = “ = [data1.xls]Tabelle1!Dta1Foodheader “
    I say like because of two things
    _ With any range referencing we need to be careful that the actual range Excel “goes” to is where we want. That goes for the range referred to in both side of the equation
    _ and then we have the scope issue for a named range … The “scope” issue confuses very easily: The right hand side of the last formula can actually be written differently when using named ranges depending on where the name “Dta1Foodheader” is “scoped”.
    I continually attempt to explain this all clearly, but you must bear in mind that it takes some very careful thought in order not to get confused. I have seen many experienced professional totally mixed up with scoping issues, and this may be part of the reason for the, incorrect in my opinion, statement that one often hears like “….…scope means what worksheets the name can be accessed from… “
    A near statement that is true would be .…scope means what worksheets the name can be accessed from if you only give the string name and no other information about where to find the name object to which that string name belongs

    Once again to attempt to add clarity…
    Consider initially just that right hand side above
    “ = [data1.xls]Tabelle1!Dta1Foodheader “
    This “takes us” to worksheet “Tabelle1” in file “data1.xls”
    Once there, the named object with string name “Dta1Foodheader” is attempted to be accessed. It does not follow directly that the range Refered To is the B5 we wanted. That information about what range is Refered To is kept in the name object with the string name “Dta1Foodheader”
    Going back to that code line, right hand side…
    There are two possibilities based on that code part ( assuming it “works”. In other words for that part not to error we must have one of these:
    _Possibility 1: At worksheet “Tabelle1” in workbook “data1.xls” we have a worksheets scoped named range object with the string name “Dta1Foodheader1”. That named object “belongs” to the named objects collection object of worksheet “Tabelle1”, so we must include the part “Tabelle1!” so that we get to that worksheet
    _Possibility 2: The workbook “data1.xls” has a workbook scoped named range object with the string name “Dta1Foodheader1”. That named object “belongs” to the named objects collection object of workbook “data1.xls” . For this possibility, we only need to use in the spreadsheet , “=Dta1Foodheader” in any worksheet. This means we can “go” to any worksheet, so for example if we have the worksheets “Tabelle2” , “Sheet3” , “MySheet” in the workbook, “data1.xls” , then all these are valid also
    “ = [data1.xls]Tabelle1!Dta1Foodheader “
    “ = [data1.xls]Tabelle2!Dta1Foodheader “
    “ = [data1.xls]Sheet3!Dta1Foodheader “
    “ = [data1.xls]MySheet!Dta1Foodheader “

    They will all give us the same result.
    In addition we have an extra valid formula: This arises because we can “go” to the Workbook. The syntax to do this would, we find, is:
    “ = data1.xls!Dta1Foodheader “
    ( I have no idea why the syntax is not “ = [data1.xls]!Dta1Foodheader “. Probably the Microsoft programmers were equally confused with what named ranges were about )


    '1a) - '1b)
    Code lines - scope to the workbook names object and then code lines - scope one of the worksheet’s names object of the Data1 file, workbook “data1.xls” . For the scoping the data 1 File had to be open, but it was closed before the named range object was referenced in the lines or . We see that we can reference the named ranges in the closed workbook. Note here , that the Referes To range is in the same workbook as the named ranges. ( A personal preference of mine is , once again, to use a full reference, also in the Refers To range. This Refers To:= argument would never need the full file path reference, as the range referenced must be to a range in an open book. Never the less, as usual, VBA accepts the full reference )
    I finally end up with a string in cell B5 in the main workbook for like
    '1a) _ "='C:\Folder\Data1.xls'!Dta1Foodheader "
    '1b) _ "='C:\Folder\[Data1.xls]Tabelle2'!Ws2Dta1Foodheader"
    Code section '1b)(ii) Is similar to '1b) , except that the data 1 workbook is open and I reference the named object with just the required reference of [Data1.xls]Tabelle2!Ws2Dta1Foodheader
    As expected I then end up with in cell B5 in the main workbook
    __ =[Data1.xls]Tabelle2!Ws2Dta1Foodheader
    But I note, that after the line which closes the data 1 workbook, code line , that formula does not error but changes to the closed workbook reference like we had before, like
    __"='C:\Folder\[Data1.xls]Tabelle2'!Ws2Dta1Foodheader"
    This behaviour is typically observed when a range is referenced in a workbook which is then closed. It would appear that a reference to named object behaves in a similar way.
    In '1c) the scope is to the main workbook. The name object used is therefore in a different workbook to that where the referred to range is, but the reference to this named range works as before. Note the main workbook is open
    '1d) This is an attempt to get at the named range object in a roundabout sort of a way. Here the data 1 cell s scoped to the second data file, “Data2.xlsx” ( Workbooks scoped to workbook “Data2.xlsx” )
    Both files must be open , for the scoping code line: data 1 file must be open as usual as it is needed in the range assignment argument Refers To:= _ ; The data 2 file must be opened as that has its names object referenced to , ( dataWb2xlsx.Names.Add ____ ) . With both files open we see in the formula bar the expected string reference to the named range:
    =Data2.xlsx!Dta2Dta1Foodheader
    If we close data 1 file, then that string does not change, and the link still works , ( we have the word “Food” in the cell B5 in the main file.)
    If we close the data 2 file also, then initially the string reference in the formula changes to a closed reference like
    ='C:\Folder\Data2.xlsx'!Dta2Dta1Foodheader
    Also initially the value “Food” still appears in the cell B5 in the main file. But if you re enter that formula, then it errors. I am not quite sure why…
    If data 2 file is re opened and the formula is re entered, then all is well
    If now data 2 file is closed, and data 1 file is opened and the value of “Food” changed, then the value “Food” still remains in cell B5 in the main file.
    So I am not quite sure what is going on there…

    Maybe I will come back to this post one day and comment further on this.




    Further with this first demo code in the next post
    _._________
    Last edited by DocAElstein; 11-16-2018 at 07:51 PM.

  9. #9
    Fuhrer, Vierte Reich DocAElstein's Avatar
    Join Date
    Aug 2014
    Posts
    9,270
    Rep Power
    10
    Rem 2 Second part of first main code



    Rem 2
    So far we have looked at the right hand side of the basic code line of, simplified,
    Range(“B5”).Value = “ = myNamedRange “
    This is very similar to investigating manual uses of named ranges, that it to say, typing things like …_
    __ = myNamedRange
    ____ _... in a spreadsheet cell: That simple code line basically writes the string in the cell , as a person would do manually.

    We take the experimenting a little further now , so as to include a named range in the left hand side, like
    Range(“RangeName”).Value = “ = myNamedRange

    Range ( “ _ “ ) What it is
    As far as I know, this Range(“ “) thing, ( that confusingly pops up all over the place as an object or property, ( an occasionally in some senior professionals opinion as a method) ), is not really supposed to be used with nothing before it, but usually it is, and usually Excel guess correct what to put in front of it, so it usually works as expected.
    The Range(“ “) thing is usually used in two main situations, in a worksheets range property
    or
    “ Application Range “ .
    The worksheets range property would have a syntax like, for example, to reference the second cell in Sheet1
    Sheet1.Range(“B1”)
    Application Range is something similar, and is what in most situations is the default that Excel uses when you just write like:…_
    Range(“ ”)
    _.... _ In many situations, Excel will take that as:
    Application.Range(“ ”)

    There is a bit more to it than all that, and that can easier be explained by looking at what that Range(“ “) thing seems to do..

    ( One thing to note here is that the official documentation is often wrong or at least questionable. It seems that nobody really understands what goes on in the internal “wiring” anymore. Often what it seems to have been done is to interpret what happens, and then Methods, Properties are given to explain what seems to happen. I have often had heated discussions with professionals that disagree with my interpretations. But sometimes literature from Microsoft has been changed to reflect my interpretations, whilst the same professionally , sometimes Microsoft MVP’s (Most Valuable Professional’s) at the time, haven’t been able to get any response from Microsoft about anything… )

    Range ( “ _ “ ) What it does
    This usually returns a range object. It takes in the (“ “) a string reference to that wanted range. That reference is similar to those discussed already. ( Once again, I believe that Excel will add to what you give, so as to give a full reference , should you only give part of it).
    If you give a full reference to say, a range in Sheet2 using Sheet1 range property, like …_
    Sheet1.Range(“=’C:\MyFolder\[MyFile.xls]Sheet2’!G5”)
    _... then that will error as it will not find G5 from Sheet2 in Sheet1
    As far as I know, Application.Range(“ “) will take any valid range reference and return the range object of that range.

    Range(“ ”) will accept a full range reference ( which is a reference to a closed workbook ) , and it will return the range object wanted, but only if that workbook is open. I expect it is designed that way as Excel will not let you make a range object of a range in a closed workbook.
    _.___________


    On now with the code part Rem 2 description.
    Initially I will make a named range for the range B5 which we were referencing so far like:
    __ Application.Range(“='C:\Folder\[MasturFile.xlsm]Tabelle1'!B5”).Value = ____
    '2a) I scope to one of the data files, data 2 file, “Data2.xlsx”. Then the code line4 above is used inn this form.
    (For the right hand side of the equation( which is required to get the value from data 1 file, B5 , we use a reference containing one of the existing named ranges Added/created in Rem 1)
    Application.Range(“='C:\Folder[Data2.xlsx]Tabelle1'!MainFoodheader").Value = ____
    Just to refresh our memories of what we are doing with that last line in the left hand side: We have in Range(“ “) a reference to a named range object in data 2 file. That in turn has the info we want of the range Referred To by that name which is B5 in the main file. This will result in range(“ “) returning us the range object of that cell. Then assigning a .Value to that range object will result in that .Value appearing in the cell in the spreadsheet. That .Value is a full reference to the ( closed) data file, ( ='C:\Folder\Data1.xls'!Dta1Foodheader ) , which brings the text “Food” into the cell B5 in the main workbook.
    With the data 2 file open, the code line ( ) works . What is perhaps slightly surprising is that with the data 2 file closed, the code line ( ) errors as it can’t define the range. ( 1004 The Range method for the _Application object failed ) . Possibly the “wiring” of Range(“ “) is set to error if any workbook referenced is closed. That is required for the more usual range reference in the (“ “), and possibly such a usage as I am doing here was simply not envisaged at the time….

    Rem 3
    As a quick reminder to simple referencing of ranges , this simply brings in the Header "Suppliment" from data 2 workbook directly without named ranges. The code line shows similar strings on both sides

    The code line is this sort of form:
    Range("=" & "'" & WbMain.Path & "" & "[" & WbMain.Name & "]" & WbMain.Worksheets.Item(1).Name & "'" & "!" & "B10").Value = "=" & "'" & dataWb2xlsx.Path & "" & "[" & dataWb2xlsx.Name & "]" & dataWb2xlsx.Worksheets.Item(1).Name & "'" & "!" & "B10"
    The actual string references are like:
    Range("='C:\MyFolder\[MasturFile.xlsm]Tabelle1'!B10 ").Value = " ='C:\MyFolder\[Data2.xlsx]Tabelle1'!B10"

    _.___

    For comparison, some corresponding code lines for bringing in the Header "Food" from data 1 workbook , using some of our created named ranges are:
    Range("='C:\MyFolder\[MasturFile.xlsm]Tabelle1'!B5 ").Value = " ='C:\MyFolder\Data1.xls'!Dta1Foodheader"
    Range("='C:\MyFolder\[MasturFile.xlsm]Tabelle1'!B5 ").Value = " ='C:\MyFolder\MasturFile.xlsm'!MainDta1Foodheader"
    Range("='C:\MyFolder\MasturFile.xlsm'!MainFoodheader ").Value = " ='C:\MyFolder\[Data1.xls]Tabelle2'!Ws2Dta1Foodheader"
    The same basic code line without using named ranges would be
    Range("='C:\MyFolder\[MasturFile.xlsm]Tabelle1'!B5 ").Value = " ='C:\MyFolder\[Data1.xls]Tabelle1'!B5""
    Remember the difference in what “goes on” with and without the named ranges is: Without the named ranges we are referencing the referred to range directly. With the named ranges, we reference somehow to the relevant named range Name object ( via its string Name) . That Name object contains, and somehow “gives out” to Excel, the referred to range: We give that Refered To range, along with the string Name when we create/Add that named range Name object to either a workbook’s named objects collection or a worksheets named objects collection.
    _._____________________________




    In the next post we consider how to bring in the data to the master workbook from the two data workbooks.


    So far we have got this far, that is to say we all the headers, that originally in the main book,
    Nutrition _ | _ Energy
    along with now the sub headers also
    Food


    Suppliment



    Using Excel 2007 32 bit
    Row\Col
    A
    B
    C
    D
    1
    2
    3
    4
    Nutrition Energy
    5
    Food
    6
    7
    8
    9
    10
    Suppliment
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    Worksheet: Tabelle1


    The words “Food” and “Suppliment” are seen in the spreadsheet cells, but in the formula bar we see for
    B5 _ - _
    B10 _ - _
    MainFoodHeader.JPG : https://imgur.com/uJCkJwb



    The words “Food” and “Suppliment” are seen in the spreadsheet cells, but in the formula bar we see for
    B5 _ - _ ='C:\MyFolder\Data1.xls'!Dta1Foodheader
    MainFoodHeader.JPG : https://imgur.com/uJCkJwb

    B10 _ - _ ='C:\MyFolder\[Data2.xlsx]Tabelle1'!B10
    MainSupplimentHeader.JPG : https://imgur.com/wQD5FPB
    Last edited by DocAElstein; 11-16-2018 at 10:59 PM.

  10. #10
    Fuhrer, Vierte Reich DocAElstein's Avatar
    Join Date
    Aug 2014
    Posts
    9,270
    Rep Power
    10

    INsert right mouse click



    Sub EvalutateExample()'Concatenate values in range B2:10 & C2:C10 and'display the result in A2:A10 Dim rng As RangeSet rng = Sheet1.Range("A2:A10") 'Change it as per you requirement 'This is what is generated as a parameter of Evaluate in this procedure'If(Row(1:7),$B$2:$B$10&$C$2:$C$10) rng.Value = Evaluate("If(Row(1:" & rng.Rows.Count & ")," & rng.Offset(, _ 1).Address(, , , True) & " & " & rng.Offset(, 2).Address(, , , True) & ")")EndSub




    CTRL V

    Sub EvalutateExample() 'Concatenate values in range B2:10 & C2:C10 and 'display the result in A2:A10 Dim rng As Range Set rng = Sheet1.Range("A2:A10") 'Change it as per you requirement 'This is what is generated as a parameter of Evaluate in this procedure 'If(Row(1:7),$B$2:$B$10&$C$2:$C$10) rng.Value = Evaluate("If(Row(1:" & rng.Rows.Count & ")," & rng.Offset(, _ 1).Address(, , , True) & " & " & rng.Offset(, 2).Address(, , , True) & ")")End Sub






    Second Main Code. Sub FoxyMultiCellNamedRanges()
    Range referencing In Excel and VBA

    Code section up to and including Rem 3 take us as far as the last code

    Before going onto the rest of the code, as an aside, a review of some basic techniques for bringing a range of data values into a main workbook, such as our "MasturFile.xlsm" , from a closed data workbook, " Data1.xls"

    Excel has two basic ways to Hold a single cell reference. Either
    it holds it as a fixed co ordinate,
    or
    it holds it as a fixed vector. The vector corresponds, ( by default settings, if you don’t specify otherwise ), as a fixed angle and direction from the cell to the worksheet origin.
    One way in which Excel can be told which system to use by including a $ sign if we want to use the co ordinate system. If no $ is included then Excel holds the fixed vector.
    The fixed vector will mean that if a cell reference in a particular cell , such as =B6 , is copied to the next cell to the right, the fixed vector is copied and shifted one place to the right. The fixed vector is responsible for bringing the value from B6 into the original cell. That same vector if placed in the next cell to the right will bring in the value of B7. Excel will then display correspondingly the appropriate reference. This would be either =B7 or $B$7 , but Excel conventionally keeps the convention given to it, so it will display =B7
    In VBA things work similarly. If I fill in a single cell with the reference =B6 using the , ( simplified) code line of .._
    __ Range(“B2“).Value = “=B6”
    ____ _.. then the vector is placed in cell B2, so I get

    C6.jpg : https://imgur.com/RrR2zrA
    Row\Col
    A
    B
    C
    D
    1
    2
    =C6
    3
    4



    If I put the same reference, =C6 , across a range, whether manually by
    copy / paste, or draging
    or
    by VBA thus: .. _
    __ __ Range(“B2:C3“).Value = “=B6”

    ____ _.. then the same fixed vector is copied thus:
    C6inB2toC3.JPG : https://imgur.com/BrMGrqn

    The convention remains to stay in the fixed vector notation, so the reference put in the cells is:
    Row\Col
    A
    B
    C
    D
    E
    1
    2
    =C6 =D6
    3
    =C7 =D7
    4
    5
    6
    a b
    7
    c d
    8

    In the spreadsheet we will see:
    Row\Col
    A
    B
    C
    D
    E
    1
    2
    a b
    3
    c d
    4
    5
    6
    a b
    7
    c d
    8
    Last edited by DocAElstein; 11-16-2018 at 11:03 PM.

Similar Threads

  1. Replies: 5
    Last Post: 06-10-2019, 10:14 PM
  2. This is a test Test Let it be
    By Admin in forum Test Area
    Replies: 6
    Last Post: 05-30-2014, 09:44 AM
  3. change table top row to a different colour with html code
    By peter renton in forum Excel Help
    Replies: 2
    Last Post: 02-17-2014, 08:08 PM
  4. Test
    By Excel Fox in forum Den Of The Fox
    Replies: 0
    Last Post: 07-31-2013, 08:15 AM
  5. Test
    By Excel Fox in forum Word Help
    Replies: 0
    Last Post: 07-05-2011, 01:51 AM

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •