2016-06-22 9 views
0
Sub InsertRow() 
Call BlankColumns 
'Call DeleteZeros 
'normalizes the data extracted from QM QSRs 
'If Columns included in QSR Change, THe column references will have to be adjusted 
Dim lastcol As Integer 'Idenfies How many Questions are in Dataset 
Dim r2a As Long 'Row to copy 
Dim nr As Integer '# of people to copy 
Dim r2s As Integer 'will copy each data set for however many questions there is 
Dim R As Integer 'Counts how many people are in the dataset 

R = Range("A4", Range("A4").End(xlDown)).Rows.Count 

    With ActiveSheet 
     lastcol = .Cells(1, .Columns.Count).End(xlToLeft).Column - 6 
     r2a = (lastcol/2) - 2 
     r2s = (lastcol/2) 
      End With 

For nr = 0 To R 
    Cells(((nr * r2s) + 4), 1).EntireRow.Copy 

     Range(ActiveCell, ActiveCell.Offset((r2a), 0)).EntireRow.Insert Shift:=xlDown 
      Next nr 

Call pasteanswers 
Call PasteActivityCode 

Question = MsgBox("Upload information to Database?", vbYesNo + vbQuestion, "Database Upload") 

If Question = vbYes Then 
Call SaveWorkbook 
Call ExportData 

Else 

End If 


End Sub 

Ошибка происходит вCells Переполнение Row Значение

Cells(((nr * r2s) + 4), 1).EntireRow.Copy 

enter image description here С кодом выше У меня возникают проблемы, когда значение ячейки строки больше, чем 32768, как мне сделать это позволить Long вместо Integer

Я не уверен, как определить эту ячейку, чтобы она могла ссылаться на строки больше целого. Также приветствуются альтернативные решения!

+0

Какую версию вы используете? –

+1

Убедитесь, что все переменные длинны, явно объявляя их; 'Dim R as Long' и т. Д. –

+0

Я использую excel 2013, я включу весь код, чтобы дать более четкое изображение и именно там, где происходит переполнение! –

ответ

1
Dim nr As Integer '# of people to copy 
Dim r2s As Integer 'will copy each data set for however many questions there is 
Dim R As Integer 'Counts how many people are in the dataset 

Изменить на:

Dim nr As Long 
Dim r2s As Long 
Dim R As Long 

Всякий раз, когда вы имеете дело с рабочего листа строк, или любое значение, которое не соответствует максимальное значение 16-разрядного целого числа (Integer), вам нужно объявить свои переменные как Long, потому что 32,768 переполняет Integer, как вы заметили.


То есть, я бы очень рекомендую переименовать эти переменные использовать значимые идентификаторы, так что вам не нужен комментарий, чтобы сказать вам, что они представляют.

Dim lastColumn As Long 
Dim rowToCopy As Long 
Dim nbPeopleToCopy As Long 
Dim r2s As Long 'sorry, not clear from comment or usage 
Dim nbRows As Long 
+0

Спасибо! просто понял, что и пришел сюда, чтобы указать, что я понял, что переменные сами должны были быть преобразованы в Longs, Большое вам спасибо! –

+1

Исправить. Это то, что * объявление переменной * делает: он * выделяет * кусок памяти для хранения этого значения - указание типа определяет, насколько большой этот фрагмент должен быть: 'Integer' является подписанным 16-битным целым типом; 'Long' - это подписанный 32-разрядный целочисленный тип. Если вы работаете в 64-разрядном Office, тогда вы также получите подписанный 64-разрядный целочисленный тип «LongLong». Переменная, которая говорит «Мне нужны 16 бит памяти (2 байта)», или тот, который говорит «Мне нужно 32 бит памяти (4 байта)», резервирует много места в памяти спереди: это меньше работает, чем выделяет ' Вариант «на лету» и динамически разрабатывает тип. –