• 締切済み

Open Office 3.2 Calc である値に一致したセルを含む

Open Office 3.2 Calc である値に一致したセルを含む行を別のシートに抜き出し一覧にする方法を教えてください。 例えば、 Sheet1 という名前のシートに 行1 1,いぬ,,5 行2 8,ねこ,a,9 行3 11,いぬ,b,d のようなデータがあるとして、 行1から順番に見ていき、列B(左から2番目)の値が いぬ という文字列の場合に、 Sheet2 という名前のシートに、 行1から順番に、そっくりそのまま参照(コピーではなく)するように値を入力し、 行1 ='Sheet1'.A1,='Sheet1.B1',='Sheet1.C1',='Sheet1.D1' 行2 ='Sheet1'.A3,='Sheet1.B3',='Sheet1.C3',='Sheet1.D3' とするということです。 例は3行ですが、実際には不規則に大量にあります。(例では奇数行に いぬ がありますが、実際はそういう規則性はありません) 数式でやろうとしましたが、規則的に連続していないものを詰めて並べるのは不可能だと思いました。 マクロでもできるのかわかりませんが、どんな関数、プロパティを使ったら出来るのかでもよいので教えてください。 私は基本的なOpen Office BasicなどOpen Officeがサポートしているスクリプト言語なら理解できます。

みんなの回答

  • mimeu
  • ベストアンサー率49% (39/79)
回答No.2

私も OpenOffice に取組んでまだ1ヶ月ですので、 たぶんまだ見苦しい習作ですが、お目にかけます。 ' Sheet1 の B列が Key_Word なら、その行のA~D列を Sheet2 と Sheet3 に転記する '  前提: B列は全部 String だと仮定する。空白セルが出てきたらそこで終る。 ' (注) 私の流儀ですが、変数には末尾に数字をつけて予約語と区別しています。 Const Key_Word = "いぬ" Sub Main Dim Sheet1 as Object, Sheet2 as Object, Sheet3 as Object Dim Row1 as long, Row2 as long, Row3 as long ' Sheet1, Sheet2, Sheet3 の処理行 Dim Cell1 as Object, c0 as long, s0 as string Sheet1 = ThisComponent.Sheets.GetByName("Sheet1") Sheet2 = ThisComponent.Sheets.GetByName("Sheet2") Sheet3 = ThisComponent.Sheets.GetByName("Sheet3") ' どのシートも2行目から始まるものと仮定する → 実際は変更を要するハズ Row1 = 1 : Row2 = 1 : Row3 = 1 Do Cell1 = Sheet1.getCellByPosition(1, Row1) ' (注) com.sun.star.table.CellContentType.EMPTY = 0 なので If Cell1.Type = 0 Then End if Cell1.Type = 2 Then s0 = Cell1.String if s0 = Key_Word Then For c0 = 0 to 3 Copy_Cell (Sheet1, Row1, c0, Sheet2, Row2) Copy_Cell (Sheet1, Row1, c0, Sheet3, Row2) Next c0 Row2 = Row2 + 1 Row3 = Row3 + 1 End If End If Row1 = Row1 + 1 Loop End Sub ' Copy と言う名ですが、ご覧の通り、Copy ではなく転記しています Private Sub Copy_Cell (Sheet1 as Object, Row1 as Long, Col0 as Long, Sheet0, Row0 as Long) Dim Cell1 as Object, Cell0 as Object Cell1 = Sheet1.getCellByPosition(Col0, Row1) Cell0 = Sheet0.getCellByPosition(Col0, Row0) Select Case Cell1. Type Case 1: Cell0.Value = Cell1.Value ' VALUE Case 2: Cell0.String = Cell1.String ' TEXT Case 3: Cell0.Formula = Cell1.Formula ' FORMULA End Select End Sub

回答No.1

'OOo-Dev 3.4(DEV300m88)で検証。 'コメントでリファレンス該当部を示した。少し過剰かも。 '他参考:http://docs.sun.com/app/docs/doc/817-1826 '字数が Sub Main() Dim i As Integer Dim j As Integer Dim n As Integer Dim srcsheet As Object Dim dstsheet As Object Dim functionaccess As Object 'http://api.openoffice.org/docs/common/ref/com/sun/star/sheet/SpreadsheetDocument.html 'http://api.openoffice.org/docs/common/ref/com/sun/star/sheet/XSpreadsheetDocument.html 'http://api.openoffice.org/docs/common/ref/com/sun/star/sheet/XSpreadsheets.html 'http://api.openoffice.org/docs/common/ref/com/sun/star/container/XNameAccess.html 'http://api.openoffice.org/docs/common/ref/com/sun/star/sheet/Spreadsheet.html Set srcsheet = ThisComponent.getSheets().getByName("Sheet1") Set dstsheet = ThisComponent.getSheets().getByName("Sheet2") 'http://api.openoffice.org/docs/common/ref/com/sun/star/sheet/FunctionAccess.html functionaccess = createUNOService("com.sun.star.sheet.FunctionAccess") n = 0 For i = 0 to 2 'http://api.openoffice.org/docs/common/ref/com/sun/star/sheet/Spreadsheet.html 'http://api.openoffice.org/docs/common/ref/com/sun/star/sheet/SheetCellRange.html 'http://api.openoffice.org/docs/common/ref/com/sun/star/table/CellRange.html 'http://api.openoffice.org/docs/common/ref/com/sun/star/table/XCellRange.html 'http://api.openoffice.org/docs/common/ref/com/sun/star/table/XCell.html If srcsheet.getCellByPosition(1,i).getFormula() = "いぬ" Then For j = 0 to 3 'FunctionAccessの使い方は他のサイトを参考にしました。配列の配列渡してもうまくいかないっぽかったので。 dstsheet.getCellByPosition(j,n).setFormula("=" & functionaccess.callFunction("ADDRESS",Array(i+1,j+1,1,1,"Sheet1")) Next j n = n + 1 End If Next i End Sub 'http://cid-b89cb784f5346675.office.live.com/browse.aspx/TestCase/Q6222502?uc=1 '面倒なので、汎用性とか全く確保してないが、(「SpreadSheetを引数にとった関数にすべき」とか、「jの値を0から3とか決め打ちすべきでない」とか、あと、個人的には、「文書にマクロをつけるんじゃなくて、マクロ自体を独立して配布できるようにしておきたい」とか) '「基本的なスクリプト言語なら理解できます。」 って書いてあるので、 'その辺のコード弄りは質問者側でなんとかなるだろうと思ってます。新たにシートを追加するコードにしなくてもいいか

関連するQ&A

  • セルの値と色を変えたい

    OS WIN10 Office2007の環境で A列B列C列で各行は20づづあります 実現したいのは 1. D列に文字列(D2に)Hが入力されると、その行のB列(B2)の値を削除2の行(A2 B2 C2)の背景色を黄色にしたい 2. D列に文字列(D2に)Gが入力されると、その行のB列(B2)の値を削除2の行(A2 B2 C2)の背景色を緑色にしたい 条件付き書式とか設定していますが うまくいきません ご指南ください

  • エクセルでセルの条件が一致したら、値を挿入したい

    エクセルで2つのシートの2つのセルの条件が一致したら、シート2の該当の部分をシート1に挿入したいのです。 例 Sheet1 A    B    C 1 社員A 100 2 社員B 200   3  社員A 500 Sheet2 A    B    C 1 社員B 100  休み 2 社員B 700  勤務 3  社員A 100  夜勤   というような2つなシートがあり(実際には、セルの行数は3000行くらいあります) Sheet1,Sheet2の比較をしてA列、B列の値が一緒である場合、シート1にシート2の該当部分を C列に挿入したいのです。 たとえば、シート1のC列に数式をいれることになるかと思うのですが、 シート1とシート2を比較すると、   シート1のA1・B1の【社員A 100】とシート2のA3・B3の【社員A 100】が一致しているので、シート2のC3の【夜勤】をシート1のC列のC1(該当する同じ行に挿入)に挿入したいのです。 どういった式をいれたらいいかわからないので、どなたかおしえていただけたら助かります。 よろしくお願い致します。 知恵をお貸し下さい。 非常にこまっております

  • エクセル 値が一致しないものを見つけたい

    お世話になります。 エクセルでA列B列にそれぞれ数値が入っている表があり、A列にはあってB列にはない数値を分かるようにしたいと思っています。      A列  B列   C列 1行目  1   1 2行目  1   5 3行目  4   0   4 4行目  5   1    5行目  1   0   1 ・A1、A2、A5の値が1であるように、A・B列とも重複する数値が入ることがあります。 ・A列とB列の値は1対1で対応し、例えばA1がB1と対応するならA2はB4と対応します。 この表ではA3、A5に対応する値がB列にないので、C列にその値を表示させています。 ・一致しない数字を分かるようにする方法にこだわりはなく、例のようにC列に値や×を表示させる、A列に色をつける、一致するものがあった数値は削除する等、なんでも構いません。 お分かりになる方、どうぞよろしくお願いいたします。

  • エクセル2つのセルを1つのデータとして一致

    エクセル初心者です。 (1)シートのA列には店舗名(A列には同じ店舗名が複数あります)とB列には数値を入力しています。(2)のシートには(1)シート同様のデータが入力されていますがCとD列に値があります。 (1)シートの同行内のAとB列を1つのデータとして(2)のシートのAとB列が一致したらCとD列の値を(1)シートに返す事は可能でしょうか? (1)シート A列    B列   C列   D列 ヤマダ   25 スズキ   10 ヤマダ   100 (2)シート A列    B列   C列   D列 ヤマダ   25    5    英 スズキ   10    6    独 ヤマダ   100    6 仏 さくら  20    8 英 つたない説明で申し訳ありません。

  • 連動させたドロップダウンリストが前の値を反映しない

    こんにちは。 先日質問して、一応解決したと思っていたんですが、なぜか機能しなくなりました。 以下がその例です。 はじめはA列の値を受けて、B列の値がしぼられていたのですが、現在は、A列が空欄でもB列のリスト選択が出来てしまいます。C列も同様です。 なにが原因かいろいろ値を変えたり、入力し直したりしましたが一向に改善の兆しが見えません。 アドバイスお願い致します。 シート2に    A   B    C 1 式場  |A式場  |B式場 2 会場1 |aa   |dd 3 会場2 |bb   |ee 4 会場3 |cc   | 5 担当1 |aさん  |dさん 6 担当2 |bさん  |eさん 7 担当3 |cさん  | シート1の2行目に入力規則を適用    A   B    C 1 式場  |会場   |担当 2 規則1 |規則2  |規則3 名前を次のように定義して(各ブロックを選択) 式場:=Sheet2!$B$1:$C$1 (実際はZまで広げています) 会場:=OFFSET(Sheet2!$B$1,1,MATCH(Sheet1!$A$2,Sheet2!$B$1:$C$1,0)-1,3,1) 担当:=OFFSET(Sheet2!$B$1,4,MATCH(Sheet1!$A$2,Sheet2!$B$1:$C$1,0)-1,3,1) 入力規則に次のように定義。 リスト 規則1=式場 リスト 規則2=会場 リスト 規則3=担当

  • セルの選択、貼り付け

    よろしくお願いします。 次のような処理をするプログラムを書きたいのですが、うまく書けません。教えてください。 (処理) 1つのExcelファイルの中で、sheet1A列のセルの値と同じ値を有するセルがsheet2A列にある場合、当該行のB列の値をsheet1のセルに貼り付ける。   (前) 〈sheet1〉       〈sheet2〉            A  B …       A  B …              1 c1           1 c1 200   2 b2           2 a1 300   3 d5           3 b3 500            :              4 b2 400                 5 d5 500                           :   (後) 〈sheet1〉                A  B …           1 c1 200     2 b2 400      3 d5 500    :            

  • 【Excel】一致するデータの検索

    Excel2003を使用しています。 Sheet1のB列の値がSheet2のA列に入力されている値と一致したら、Sheet1のC列とD列の値をSheet2のC列とD列に表示させたく、VLOOKUP関数を使用したところ、Sheet1のB列とSheet2のA列のデータの並び方(順序)が同じではないためか、VLOOKUP関数ではできませんでした。 こういう場合、マクロで処理することは可能でしょうか?可能であれば、どのようにコードを記述すればいいでしょうか? Sheet1のデータは4行目から、Sheet2のデータは6行目から入力されています。 よろしくお願いします。

  • VLOOKUPでは値が返せられないです。

    本当のドシロウトです。 用語での質問の仕方すら難儀しています。 VLOOKUPでは出来ませんでした。 =VLOOKUP(A1,C:D,2) とやりましたら、B列に関係のないC列の文字列を拾っていまいます。 =VLOOKUP("*"&A1&"*",C:D,2,FALSE)も出来ませんでした。 A列にはそれぞれセル内に改行された文字列が入っておりセル内行数も一定ではございません。文字列の行の順番も不規則で、 5000行位まであります。(>_<) 例を作ってみました。↓         A                        -----------------------                       色別リスト:赤  1行  色別リスト:赤:りんご     果物:りんご     色別リスト     色別リスト:赤:りんご:青森産      果物:りんご     ---------------------------------------     野菜:大根 2行  種類:根野菜     色別リスト:白     色別リスト:白:大根   ---------------------------------- C列に   C --------------------- 色別リスト:白 --------------------- 色別リスト:ピンク -------------------- ・・とやはり数千行あります。 A列以外は、セル内改行文字列はございません。 A列各セル内にC列の文字列が含まれている場合、C列右隣のD列の値をB列に返したいのですが、、、ご教示お願い申し上げます。 会社で使っているオフィスは2007なのですが、今自宅では2000を使っています。

  • セルの値を参照して名前を定義する方法

    A列  B列 a    ああああ b   いいいい b   うううう b   ええええ c   おおおお c   かかかか d   きききき d   くくくく d   けけけけ d   ここここ d   ささささ このような配列でデータが存在します。 A列の文字を名前にしてB列に名前を定義しようとしています。 例えばああああという文字列にaという名前を定義したいのです。 いいいい、うううう、ええええにはbという名前を定義したいのです。 A列の同じデータの数が決まっていないので Dim cnt As Long 'A列の同じ値の数 Dim tName As String 'A列の値 cnt = WorksheetFunction.CountIf(ActiveSheet.Range("A1:B500"), tName) という関数を探してきたので、これでA列の同じ値のセルの数を取得しようと思います。 名前の定義はマクロを記録したところ・・・ ActiveWorkbook.Names.Add Name:="a", RefersToR1C1:="=Sheet1!R2C2:R2C2" を得ました。 この後どのようにしてプログラムを組み立てたらいいでしょうか。 よろしくお願いします。

  • 別シート同士のセルを比較して一致したらセルに代入をしたいと考えています

    別シート同士のセルを比較して一致したらセルに代入をしたいと考えています。 excelのVBAを使って行いたいのです book1のsheet1に A列     B列    C列       D列 2000     NEC   VL100 5000     Sony   vaio-200 3000     東芝     letsnote 単価、メーカー、型番、空き列があり 200行くらいです。 book2のsheet1に 同じく、単価、メーカー、型番がありますが 単価がsheet1とは異なり、違うメーカー型番の情報が 4000行くらいあります A列     B列    C列 5225     XXXX   XXXX 2200     NEC   VL100 5200     Sony   vaio-200 2684     XXXX   XXXX 2566     XXXX   XXXX 6000     東芝     letsnote ・・・・・・ ・・・・・・ そこで book1のB,C列のメーカーと型番が一致するものを book2のsheet1のB,C列から探し 一致したら、book1のsheet1のD列に book2 sheet1のA列の値を入れのです。 参考になるスクリプトを教えて頂けると大変助かります、 よろしくお願い致します。

専門家に質問してみよう