シートの内容は漢字、カタカナ、ひらがな、英語、数字で書かれてある。
どうすれば、漢字、ひらがな、カタカナは全部削除されて、英語と数字だけは残る。
ひとつの方法として,文字列の左側から一文字づつ漢字,ひらがなとか,文字
の種類を判断して,英語(アルファベット)と数字だけを取り出した文字列を
作成または,アルファベットと数字だけ残して,後は削除していくという方法
が考えられます.
シートってなんですか?
>シートってなんですか?
すみません.わかりません.
勉強がてらやってみました。
procedure TForm1.Button1Click(Sender: TObject);
var
Excel: Variant;
WorkBook: Variant;
WorkSheet: Variant;
Range: Variant;
vData: array of array of Variant;
r, c: integer;
//--------------------------------------------------
//使用できない文字が含まれているかどうか判定する関数
//--------------------------------------------------
function IsRightString(const str: string):Boolean;
var
i:integer;
begin
result := false;
for i := 1 to Length(str) do
if not (str[i] in ['a'..'z','A'..'Z','0'..'9']) then exit;
result := true;
end;
const
rMax: integer = 10;
cMax: integer = 10;
begin
Excel := CreateOleObject('Excel.Application');
WorkBook := Excel.Workbooks.Open('d:\temp\test.xls');
try
WorkSheet := WorkBook.WorkSheets[1];
SetLength(vData, rMax, cMax);
for r:=0 to rMax-1 do begin
for c:=0 to cMax-1 do begin
vData[r,c] := WorkSheet.Cells[r+1,c+1].Value;
if not IsRightString(vData[r,c]) then
vData[r,c] := '';
end;
end;
//シート2へ判定後のデータを代入
WorkSheet := WorkBook.WorkSheets[2];
Range := WorkSheet.Range[WorkSheet.Cells[1,1], WorkSheet.Cells[rMax, cMax]];
Range.value := Variant(vData);
WorkBook.SaveAs( Filename:='d:\temp\test.xls'); //保存
finally
WorkBook.close;
WorkBook:=unAssigned;
WorkSheet:=unAssigned;
Excel.Quit;
Excel:=unAssigned;
end ;
end;
シートはEXCELのシートです。今はMicrosoft visual basic を使ってシートの内容を調整しようとするところです。
ご意見ありがとうございます。知識不足で乗せたソースはわからなかったですが、すみませんでした。
1.文字列の左側から一文字づつ漢字,ひらがなとか,文字
の種類を判断して,英語(アルファベット)と数字だけを取り出した文字列を
作成する。
数字を判断する関数(Isnumber)はわかりますが、 英語(アルファベット)を判断する関数はわからないです。
宜しくお願いいたします。
サンプルソースのどの部分がわからないのですか?
回答そのものだと思うのですが、、、
もう少し、ソースを解読する努力してみてください。
>数字を判断する関数(Isnumber)はわかりますが、 英語(アルファベット)を判断する関数はわからないです。
サンプルソースに関数としてあります。
それとも、外してますか?
まったく素人で英語(アルファベット)を判断する関数を外してもらいますか?
Microsoft visual basic 上で対象のセル範囲を選択して、文字列、数値(数字)の混在したデータから、数値だけを取り出すソースは
Sub test03()
Dim c As Range, i As Integer
For Each c In Selection
For i = 1 To Len(c.Value)
If IsNumeric(Mid(c.Value, i, 1)) Then
c.Offset(, 1).Value = c.Offset(, 1).Value & Mid(c.Value, i, 1)
End If
Next
Next c
End Sub
あっ、わたし外してますね。
VBAでそこまで出来てるんだったら自力でも出来そうな気がしますが、、、
function RightStringOnly(const str: string): string;
var
i:integer;
retval: string;
begin
retval := '';
for i := 1 to Length(str) do
if (str[i] in ['a'..'z','A'..'Z','0'..'9']) then
retval := retval + str[i];
result := retval;
end;
数値だけなら
function NumericOnly(const str: string): string;
var
i:integer;
retval: string;
begin
retval := '';
for i := 1 to Length(str) do
if (str[i] in ['0'..'9']) then
retval := retval + str[i];
result := retval;
end;
それだと2バイト文字があったら変になるのでは?
ご指摘のとおり、おかしくなります。
確認しました。 m(__)m
これはどうでしょうか?
function ExtractNumbers(const Str:string):string;
var
i,pini,pend:integer;
state:Boolean; // true in numbers
begin
result := '';
state := false;
pini := -1;
i := 1;
repeat
if Str[i] in ['0'..'9'] then
begin
if state then
Inc(i) // in numbers ..
else
begin
state := true; // start numbers
pini := i;
Inc(i);
end;
end else
begin
if state then
begin
state := false; // exit numbers
pend := i-1;
result := result + Copy(Str,pini,pend-pini+1);
end
else
if Str[i] in LeadBytes then Inc(i,2) else Inc(i);
end;
until (i > Length(Str));
if state then begin
pend := Length(Str);
result := result + Copy(Str,pini,pend-pini+1);
end;
end;
こんな感じのもどうでしょうか?
function RightStringOnly(const str: string): string;
var
i:integer;
retval: string;
begin
if str = '' then
begin
Result := '';
exit;
end;
retval := '';
i:=1;
repeat
case ByteType(Copy(str, i, Length(str)),1) of
mbSingleByte:
begin
if (str[i] in ['a'..'z','A'..'Z','0'..'9']) then
retval := retval + str[i];
Inc(i, 1);
end;
mbLeadByte:
begin
Inc(i, 2);
end;
end;
until (i > Length(str));
result := retval;
end;
あの〜、natuさんはVBの質問をされているように感じるのは、私だけでしょうか?
VBならAsc関数を使って英数字を判断すればいいのではないでしょうか?
た、たしかに。(汗
> 今はMicrosoft visual basic を使ってシートの内容を調整しようとするところです。
とこどき板を間違えて来る人がいますね。
サンプルソースを示しても、完全否定されませんでしたので、Delphiの質問なんだなと思い込んでます。
初めの質問で****.co.jpメールアドレスを公開されていますが、会社でも同様の質問の仕方をされているのか心配になっちゃいます。
ツイート | ![]() |