35万件以上あるエクセルデータに対して、マクロを使って以下のような処理で重複業を削除したいと思っています。
Sub DeleteOldRow()
Dim lastRow As Integer
Dim i As Integer
Dim j As Integer
Dim strVal As String
'B列の最終行を求めます。
lastRow = ActiveSheet.Cells(ActiveSheet.Rows.Count, 2).End(xlUp).Row
'1行目から最終行の前まで繰り返します。
For i = 1 To lastRow - 1
'チェックする値を、strValに代入します。
strVal = ActiveSheet.Cells(i, 2).Value
'今見てる行から、下をチェックします。
For j = i + 1 To lastRow
'もし、値が同じであれば、
If strVal = ActiveSheet.Cells(j, 2).Value Then
'元の行を削除します
ActiveSheet.Rows(i).Delete
'最終行が1行減ったのでlastRowの値を減らします。
lastRow = lastRow - 1
'チェックしている行を1行前に戻します。
j = j - 1
End If
Next j
Next i
End Sub
上記処理を35万件あるファイル上でマクロの実行すると、オーバーフローしてしまいました。マクロ側で対象ファイルを読み込むなどして、処理を軽くするやり方はありますでしょうか。上記処理にどのような処理を加えればスムーズに処理されるでしょうか。
初歩的な質問ですみません…
str文字列からcという文字を見つけたら添字を返すという関数を作ったのですが、
iにこの関数を代入して、if文の制御式にiを使って比較するまでは正常なのですが、
真文にiを使うと何故か偽文(という言い方でいいのでしょうか…この場合("そんな値はありません。"というところです)が実行されてしまいます。
よろしければご教授お願い致します。
#include <stdio.h>
int str_char(const char str[],int c) {
int len = strlen(str);
int i;
for (i = 0;i < len;i++) {
if (str[i] == c)
return i;
}
return -1;
}
int main() {
char str[64] = "Fucking Brutal Death Metal";
int ch,i;
printf("どの文字を調べますか?");
scanf("%c",&ch);
i = str_char(str,ch);
if (i >= 0)
printf("その文字は%d番目にあります。",str_char(str,ch) + 1); //何故かiだと動かない
else
printf("そんな値はありません。");
return 0;
}
シートやセルを使わず、VBAのみでクイックソートを実装したいのですが
桁数が混在する列だと正しくソートされません。
1
1
10
10
15
2
等と言う結果になります。
元のデータは外部ファイルで修正をかけたくないので
VBA内で格納したデータの桁数を調節する等解決策はありますでしょうか?
以下メソッドです
Sub QuickSort1(ByRef argAry As Variant, ByVal lngMin As Long, ByVal lngMax As Long, sortnum As Integer)
Dim i As Long
Dim j As Long
Dim vBase As Variant
Dim vSwap() As Variant: ReDim vSwap(UBound(argAry))
vBase = argAry(sortnum)(Int((lngMin + lngMax) / 2))
i = lngMin
j = lngMax
Do
Do While argAry(sortnum)(i) < vBase
i = i + 1
Loop
Do While argAry(sortnum)(j) > vBase
j = j - 1
Loop
If i >= j Then Exit Do
For i3 = 1 To UBound(argAry)
vSwap(i3) = argAry(i3)(i)
argAry(i3)(i) = argAry(i3)(j)
argAry(i3)(j) = vSwap(i3)
Next
i = i + 1
j = j - 1
Loop
If (lngMin < i - 1) Then
Call QuickSort1(argAry, lngMin, i - 1, sortnum)
End If
If (lngMax > j + 1) Then
Call QuickSort1(argAry, j + 1, lngMax, sortnum)
End If
End Sub
シートやセルを使わず、VBAのみでクイックソートを実装したいのですが
桁数が混在する列だと正しくソートされません。
1
1
10
10
15
2
等と言う結果になります。
元のデータは外部ファイルで修正をかけたくないので
VBA内で格納したデータの桁数を調節する等解決策はありますでしょうか?
以下メソッドです
Sub QuickSort1(ByRef argAry As Variant, ByVal lngMin As Long, ByVal lngMax As Long, sortnum As Integer)
Dim i As Long
Dim j As Long
Dim vBase As Variant
Dim vSwap() As Variant: ReDim vSwap(UBound(argAry))
vBase = argAry(sortnum)(Int((lngMin + lngMax) / 2))
i = lngMin
j = lngMax
Do
Do While argAry(sortnum)(i) < vBase
i = i + 1
Loop
Do While argAry(sortnum)(j) > vBase
j = j - 1
Loop
If i >= j Then Exit Do
For i3 = 1 To UBound(argAry)
vSwap(i3) = argAry(i3)(i)
argAry(i3)(i) = argAry(i3)(j)
argAry(i3)(j) = vSwap(i3)
Next
i = i + 1
j = j - 1
Loop
If (lngMin < i - 1) Then
Call QuickSort1(argAry, lngMin, i - 1, sortnum)
End If
If (lngMax > j + 1) Then
Call QuickSort1(argAry, j + 1, lngMax, sortnum)
End If
End Sub
Private Sub Worksheet_Activate()
Dim wsData As Worksheet
Dim number As Variant
Const SH_DATA As String = "データ入力"
Set wsData = Worksheets(SH_DATA)
On Error Resume Next
If wsData.Range("G3") = "" Then
number = InputBox("個人番号を入力してください")
If number Is Nothing Then
Exit Sub
Else
wsData.Range("G3") = number
MsgBox "性別を選択してボタン(1)を押してください"
End If
End If
End Sub
このコードの
If number Is Nothing Then
のところがうまく動きません、、、
カーソルをnumberに持っていくと値はきちんとはいっています!
なのに何回やっても
Exit Sub
に飛んでしまいます(-_-;)
どなたかよろしくお願いします(__)
Sub clear()
Dim wskyu As Worksheet
Dim wsData As Worksheet
Dim Y As Range
Const SH_KYUYO As String = "給与明細"
Const SH_DATA As String = "データ入力"
Set wskyu = Worksheets(SH_KYUYO)
Set wsData = Worksheets(SH_DATA)
With wsData
For Each Y In .Range("C3:G55")
If Y.Interior.ColorIndex <> xlNone Then
Y.ClearContents
End If
Next
End With
With wskyu
Range ("P7:AQ7"), .Range("D10:AQ10"), .Range("D13:AQ13"), _
.Range("D17:AQ17"), .Range("D20:AQ20"), .Range("D24:AQ24"), _
.Range("D29:AI29").Select
Selection.SpecialCells(xlCellTypeConstants, 23).Select
Selection.ClearContents
End With
MsgBox "個人番号を入力後、性別を選択しボタン(1)を押してください"
End Sub
値のみ削除しようと上のコードを書いたのですが
With wskyu
のあとの
Range~
でプロパティの使い方が不正です
と言われてしまいました(-_-;)
ヘルプボタンがあったので押しても空のページに飛んでしまい
どうすればよいのかわかりません、、、
どうかよろしくおねがいします!!