シート内の漢字、ひらがな、カタカナを一気に削除したい


natu  2004-12-07 23:57:15  No: 12155

シートの内容は漢字、カタカナ、ひらがな、英語、数字で書かれてある。
  
どうすれば、漢字、ひらがな、カタカナは全部削除されて、英語と数字だけは残る。


Mr.XRAY  URL  2004-12-08 00:10:05  No: 12156

ひとつの方法として,文字列の左側から一文字づつ漢字,ひらがなとか,文字
の種類を判断して,英語(アルファベット)と数字だけを取り出した文字列を
作成または,アルファベットと数字だけ残して,後は削除していくという方法
が考えられます.


りおりお  2004-12-08 01:11:56  No: 12157

シートってなんですか?


Mr.XRAY  URL  2004-12-08 02:40:47  No: 12158

>シートってなんですか?

すみません.わかりません.


多分Excelなんでしょうね、、、  2004-12-08 02:59:04  No: 12159

勉強がてらやってみました。

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;


NATU  2004-12-08 20:05:30  No: 12160

シートはEXCELのシートです。今はMicrosoft visual basic を使ってシートの内容を調整しようとするところです。
ご意見ありがとうございます。知識不足で乗せたソースはわからなかったですが、すみませんでした。

1.文字列の左側から一文字づつ漢字,ひらがなとか,文字
の種類を判断して,英語(アルファベット)と数字だけを取り出した文字列を
作成する。
    
  数字を判断する関数(Isnumber)はわかりますが、  英語(アルファベット)を判断する関数はわからないです。

  宜しくお願いいたします。


やっぱりExcelでしたか、、、  2004-12-08 20:23:10  No: 12161

サンプルソースのどの部分がわからないのですか?

回答そのものだと思うのですが、、、

もう少し、ソースを解読する努力してみてください。

>数字を判断する関数(Isnumber)はわかりますが、  英語(アルファベット)を判断する関数はわからないです。

サンプルソースに関数としてあります。

それとも、外してますか?


natu  2004-12-08 23:01:14  No: 12162

まったく素人で英語(アルファベット)を判断する関数を外してもらいますか?

  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


やっぱりExcelでしたか、、、  2004-12-09 01:24:08  No: 12163

あっ、わたし外してますね。

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;


やっぱりExcelでしたか、、、  2004-12-09 01:25:57  No: 12164

数値だけなら

  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;


りおりお  2004-12-09 01:27:24  No: 12165

それだと2バイト文字があったら変になるのでは?


やっぱりExcelでしたか、、、  2004-12-09 01:37:07  No: 12166

ご指摘のとおり、おかしくなります。
確認しました。  m(__)m


りおりお  2004-12-09 01:53:31  No: 12167

これはどうでしょうか?

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;


やっぱりExcelでしたか、、、  2004-12-09 02:31:47  No: 12168

こんな感じのもどうでしょうか?

  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;


Basser  2004-12-09 04:21:10  No: 12169

あの〜、natuさんはVBの質問をされているように感じるのは、私だけでしょうか?
VBならAsc関数を使って英数字を判断すればいいのではないでしょうか?


りおりお  2004-12-09 06:57:55  No: 12170

た、たしかに。(汗

> 今はMicrosoft visual basic を使ってシートの内容を調整しようとするところです。

とこどき板を間違えて来る人がいますね。


やっぱりExcelでしたか、、、  2004-12-09 07:34:46  No: 12171

サンプルソースを示しても、完全否定されませんでしたので、Delphiの質問なんだなと思い込んでます。

初めの質問で****.co.jpメールアドレスを公開されていますが、会社でも同様の質問の仕方をされているのか心配になっちゃいます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加