an alternative for looping though columns is a For Each cell in my1RowRange loop, where
besides that, your code has some major flaws:
your range references use simple Cells(...) reference without any explicit worksheet and workbook reference before them
so that they keep referencing the active worksheet in the active workbook
and this is no good since during your loop you only seem to keep changing the right workbook while you're actually only changing it once at the beginning (Windows("KP.xlsm").Activate) and then it always remains the only referenced workbook
avoid Activate/ActiveXXX (as well as Select/Selection) coding, since
it's error prone, like it proved to be right here, since it most likely lead you to loose control over actual active workbook/worksheet
it's time consuming and gets screen flickerings
so consider the following refactoring of your code:
Option Explicit
Sub copytest()
Dim i As Long
Dim compWb As Workbook
Dim compRng As Range, cell As Range
Set compWb = Workbooks.Open "D:\test\COMP.xlsx" '<--| set the workbook to open to a specific variable of 'Workbook' type
With compWb.Worksheets("Compliance") '<--| refer to "compliance" worksheet of the "right" (you're explicitly referencing it!) workbook
Set compRng = .Range(.Cells(18, 3), .Cells(30, 3)) '<--| set the "source" range: all the dots means we're referencing the object after the last "With" statement
End With
i = 3
With Workbooks("KP.xlsm").Worksheets("MOH") '<--| refer to "MOH" worksheet of "KP" workbook
For Each cell In .Range(.Cells(12, 3), .Cells(12, 14)) '<--| loop through cells of a 1-row range of the referenced worksheet: this means looping through columns!
cell.Resize(13).Value = compRng.Offset(, i - 3).Value '<--| paste values while offsetting the "souce" range columns (first iteration with offset=0)
i = i + 2
Next cell
End With
compWb.Close '<--| close the opened workbook
End Sub