2016-06-22 5 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 

der Fehler auftritt innerhalbZellen Überlauf Zeilenwert

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

enter image description here Mit dem obigen Code ich Probleme habe, wenn die Zeilenzellen Wert größer als 32.768 ist, wie kann ich dies für Long erlauben machen anstelle von Integer

Ich bin mir nicht sicher, wie Sie diese Zelle definieren, damit sie Zeilen referenzieren kann, die größer als eine ganze Zahl sind. Alternative Lösungen werden ebenfalls geschätzt!

+0

Welche Version von Excel verwenden Sie? –

+1

Stellen Sie sicher, dass alle Variablen Long sind, indem Sie sie explizit deklarieren. 'Dim R as Long' usw. –

+0

Ich benutze Excel 2013, ich werde den ganzen Code einschließen, um ein klareres Bild zu geben und genau, wo der Überlauf auftritt! –

Antwort

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 

Wechseln zu:

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

Jedes Mal, wenn Sie mit Arbeitsblatt Zeilen umgehen, oder einen beliebigen Wert, der nicht den maximalen Wert eines ganzzahligen 16-Bit passt (Integer), Sie müssen Sie Ihre Variablen als deklarieren, weil 32.768 einen Integer überläuft, wie Sie bemerkt haben.


Das heißt, würde ich empfehlen Sie herzlich diese Variablen umbenennen sinnvolle Bezeichner verwenden, so dass Sie nicht über einen Kommentar muss sagen, was sie darstellen.

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

Danke! realisierte das und kam hierher, um darauf hinzuweisen, dass ich erkannte, dass die Variablen selbst in Longs konvertiert werden mussten, Vielen Dank! –

+1

Korrigieren. Das * deklariert eine Variable *: dotiert * einen Speicherbereich, um diesen Wert zu speichern. Wenn ein Typ angegeben wird, bestimmt, wie groß dieser Block sein soll: 'Ganzzahl 'ist ein vorzeichenbehafteter 16-Bit-Ganzzahltyp; 'Long' ist ein vorzeichenbehafteter 32-Bit-Integer-Typ. Wenn Sie 64-Bit-Office verwenden, erhalten Sie auch einen vorzeichenbehafteten 64-Bit-Integertyp, 'LongLong'. Eine Variable, die sagt "Ich brauche 16 Bits Speicher (2 Bytes)", oder eine, die sagt "Ich brauche 32 Bits Speicher (4 Bytes)", reserviert so viel Speicherplatz im Vordergrund: es ist weniger Arbeit als die Zuweisung eines ' Variante "on-the-fly" und den Typ dynamisch ausarbeiten. –