title: Copying a range of columns within a row instead of entire row to another sheet?
body: <p>I'm pretty clueless on this stuff, just starting to play with it.  I have a code I got from a website, I customized it and it works great.  It looks at a value in column 12 (a numeric value) on a master sheet, in my case "invoice2" and then copies that entire row based on the column 12 value to the pre-created sheet matching that value in my workbook.  What I'd like is for it to only copy the row from columns A to H, not the entirety of columns A to L.  I cannot for the life of me figure out where to adjust that in this code.  Can anyone assist?</p>
  
  <pre><code>'&lt;&lt;&lt;&lt;  Create a new sheet for every Unique value or paste it below the existing data if the sheet exists  &gt;&gt;&gt;&gt;&gt;
  
  'This example copy all rows with the same value in the first column of
  'the range to a new worksheet. It will do this for every unique value.
  'The sheets will be named after the Unique value.
  'If the sheet already exists the data will be pasted below the existing data on that worksheet.
  
  'Note: this example use the function LastRow and SheetExists in the ModReset module
  
  Sub Copy_To_Worksheets_2()
  'Note: This macro use the function LastRow and SheetExists
  Dim My_Range As Range
  Dim FieldNum As Long
  Dim CalcMode As Long
  Dim ViewMode As Long
  Dim ws2 As Worksheet
  Dim Lrow As Long
  Dim cell As Range
  Dim CCount As Long
  Dim WSNew As Worksheet
  Dim ErrNum As Long
  Dim DestRange As Range
  Dim Lr As Long
  
  'Set filter range on ActiveSheet: A11 is the top left cell of your filter range
  'and the header of the first column, D is the last column in the filter range.
  'You can also add the sheet name to the code like this :
  'Worksheets("Sheet1").Range("A11:D" &amp; LastRow(Worksheets("Sheet1")))
  'No need that the sheet is active then when you run the macro when you use this.
  Set My_Range = Range("A12:L" &amp; LastRow(ActiveSheet))
  My_Range.Parent.Select
  
  If ActiveWorkbook.ProtectStructure = True Or _
     My_Range.Parent.ProtectContents = True Then
      MsgBox "Sorry, not working when the workbook or worksheet is protected", _
             vbOKOnly, "Copy to new worksheet"
      Exit Sub
  End If
  
  'This example filters on the first column in the range(change the field if needed)
  'In this case the range starts in A so Field:=1 is column A, 2 = column B, ......
  FieldNum = 12
  
  'Turn off AutoFilter
  My_Range.Parent.AutoFilterMode = False
  
  'Change ScreenUpdating, Calculation, EnableEvents, ....
  With Application
      CalcMode = .Calculation
      .Calculation = xlCalculationManual
      .ScreenUpdating = False
      .EnableEvents = False
  End With
  ViewMode = ActiveWindow.View
  ActiveWindow.View = xlNormalView
  ActiveSheet.DisplayPageBreaks = False
  
  'Add a worksheet to copy the a unique list and add the CriteriaRange
  Set ws2 = Worksheets.Add
  
  With ws2
      'first we copy the Unique data from the filter field to ws2
      My_Range.Columns(FieldNum).AdvancedFilter _
              Action:=xlFilterCopy, _
              CopyToRange:=.Range("A1"), Unique:=True
  
      'loop through the unique list in ws2 and filter/copy to a new sheet
      Lrow = .Cells(Rows.count, "A").End(xlUp).Row
      For Each cell In .Range("A2:A" &amp; Lrow)
  
          My_Range.Parent.Select
          'Filter the range
          My_Range.AutoFilter Field:=FieldNum, Criteria1:="=" &amp; _
                                                          Replace(Replace(Replace(cell.Value, "~", "~~"), "*", "~*"), "?", "~?")
  
          'Check if there are no more then 8192 areas(limit of areas)
          CCount = 0
          On Error Resume Next
          CCount = My_Range.Columns(1).SpecialCells(xlCellTypeVisible) _
                   .Areas(1).Cells.count
          On Error GoTo 0
          If CCount = 0 Then
              MsgBox "There are more than 8192 areas for the value: " &amp; cell.Value _
                   &amp; vbNewLine &amp; "It is not possible to copy the visible data." _
                   &amp; vbNewLine &amp; "Tip: Sort your data before you use this macro.", _
                     vbOKOnly, "Split in worksheets"
          Else
              'Add a new worksheet or set a reference to a existing sheet
              If SheetExists(cell.Text) = False Then
                  Set WSNew = Worksheets.Add(After:=Sheets(Sheets.count))
                  On Error Resume Next
                  WSNew.Name = cell.Value
                  If Err.Number &gt; 0 Then
                      ErrNum = ErrNum + 1
                      WSNew.Name = "Error_" &amp; Format(ErrNum, "0000")
                      Err.Clear
                  End If
                  On Error GoTo 0
                  Set DestRange = WSNew.Range("A1")
              Else
                  Set WSNew = Sheets(cell.Text)
                  Lr = LastRow(WSNew)
                  Set DestRange = WSNew.Range("A" &amp; Lr + 1)
              End If
  
              'Copy the visible data to the worksheet
              My_Range.SpecialCells(xlCellTypeVisible).Copy
              With DestRange
                  .Parent.Select
                  ' Paste:=8 will copy the columnwidth in Excel 2000 and higher
                  ' Remove this line if you use Excel 97
                  .PasteSpecial xlPasteValues
                  .PasteSpecial xlPasteFormats
                  Application.CutCopyMode = False
                  .Select
              End With
          End If
  
          ' Delete the header row if you copy to a existing worksheet
          If Lr &gt; 1 Then WSNew.Range("A" &amp; Lr + 1).EntireRow.Delete
  
          'Show all data in the range
          My_Range.AutoFilter Field:=FieldNum
  
      Next cell
  
      'Delete the ws2 sheet
      On Error Resume Next
      Application.DisplayAlerts = False
      .Delete
      Application.DisplayAlerts = True
      On Error GoTo 0
  
  End With
  
  'Turn off AutoFilter
  My_Range.Parent.AutoFilterMode = False
  
  If ErrNum &gt; 0 Then
      MsgBox "Rename every WorkSheet name that start with ""Error_"" manually" _
           &amp; vbNewLine &amp; "There are characters in the name that are not allowed" _
           &amp; vbNewLine &amp; "in a sheet name or the worksheet already exist."
  End If
  
  'Restore ScreenUpdating, Calculation, EnableEvents, ....
  My_Range.Parent.Select
  ActiveWindow.View = ViewMode
  With Application
      .ScreenUpdating = True
      .EnableEvents = True
      .Calculation = CalcMode
  End With
  
  
  End Sub
  
  Function LastRow(sh As Worksheet)
  On Error Resume Next
  LastRow = sh.Cells.Find(What:="*", _
                          After:=sh.Range("A1"), _
                          Lookat:=xlPart, _
                          LookIn:=xlValues, _
                          SearchOrder:=xlByRows, _
                          SearchDirection:=xlPrevious, _
                          MatchCase:=False).Row
  On Error GoTo 0
  End Function
  
  Function SheetExists(SName As String, _
                   Optional ByVal WB As Workbook) As Boolean
  'Chip Pearson
  On Error Resume Next
  If WB Is Nothing Then Set WB = ThisWorkbook
  SheetExists = CBool(Len(WB.Sheets(SName).Name))
  End Function
  </code></pre>