質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

解決済

空白セルを検索してその隣列から貼り付けしたい

rtgsdfsdg
rtgsdfsdg

総合スコア0

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

3回答

0評価

1クリップ

90閲覧

投稿2021/07/04 02:48

以下の”組織図”シートから”Sheet1”シートにコピペするマクロなのですが、
うまくいきません。
”組織図” 例)
営業課     メンバー)山田花子
課長)田中太郎

”Sheet1”シートのA列に課を、
B列に一つ下のセルの課長を、
C列に一つ右のセルのメンバーを貼り付けたいのですが、
以下の書き方ですと、C列の同じ空白セルに何度も貼り付けしてしまいます。
どうしたらよいでしょうか。

Sub メンバー検索()

Dim SearchRange As Range '検索範囲格納 Dim ResultRange As Range '検索結果格納 Dim StartRange As Range '検索行格納 Dim KeyItem As String Dim MsgStr As String Set SearchRange = Worksheets("組織図").Range("A:Z") '検索したいデータ範囲 KeyItem = "課" Set ResultRange = SearchRange.Find(KeyItem, LookAt:=xlPart) If Not ResultRange Is Nothing Then Set StartRange = ResultRange.Offset(0, 1) '最初に見つかったセルを格納しておく Do If InStr(ResultRange.Value, "課長") = 0 And InStr(ResultRange.Value, "課担当") = 0 Then ResultRange.Offset(0, 1).Copy Worksheets("Sheet1").Cells(Rows.Count, 2).End(xlUp).Offset(1, 1).PasteSpecial (xlPasteValues) Application.CutCopyMode = False End If Set ResultRange = SearchRange.FindNext(After:=ResultRange) '次の検索セルを指定する If ResultRange.Offset(0, 1).Address = StartRange.Address Then '見つかったセルが最初のセルか判定 Exit Do '同じ場合はループを離脱 End If

Loop

End If

End Sub

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

回答3件

2

ベストアンサー

ご提示のPythonコードであれば、このように記述することもできます。ただしPythonとは違い、Rustの[T], [T; N], Vec<T>対する添字は範囲外だとパニックが発生することに注意してください。

rust

let a/*: [i32; 3]*/ = [0, 1, 2]; // これでも同様 //let a = vec![0, 1, 2]; let _ = &a[1..]; let _ = &a[0..1];

TaniguchiTakakiさんが提示した<[T]>::getの場合、返り値はOption<T>となり、「範囲内ならこう、範囲外ならこう」という分岐が可能になります。

rust

let array = [1, 2, 3]; if let Some(part) = array.get(1..) { println!("{:?}", part); } else { // この分岐では`part`は使用できない println!("out of bound"); }

Pythonのsliceとは違い、[]の中に直接入れるときとそうでないときで記法は変わりません。

rust

let range = 1..; let _ = a[range];

もう一つ大きな違いとしては、[]の中に入れられる範囲stepのような情報を持ちません。stepしたい場合はイテレータで解決する必要があります。

rust

let a = [1, 2, 3, 4, 5]; let part = a.iter().copied().step_by(2).collect::<Vec<_>>(); assert_eq!([1, 3, 5], *part);

ちなみに「スライス」という語はRustにおいても存在しますが、違うものを指します。スライス、[T]は長さがコンパイル時に定まらない列のことです。[T; N] (配列)Vec<T> (「ベクタ」と発音)の中身をスライスと取ることもできます。スライスの参照ではないスライスの実体そのものは、そのまま変数を束縛することができません。

rust

let slice_ref = &[1, 2, 3][..]; // 配列[i32; 3]の全範囲をスライスと取り、その参照を取る let _ = *slice_ref; // これはOK。実体そのもので変数を束縛する訳ではないので。 let slice = *slice_ref; // error[E0277]: the size for values of type `[{integer}]` cannot be known at compilation time // --> src/main.rs:4:9 // | // 4 | let slice = *slice_ref; // | ^^^^^ doesn't have a size known at compile-time // | // = help: the trait `Sized` is not implemented for `[{integer}]` // = note: all local variables must have a statically known size // = help: unsized locals are gated as an unstable feature

投稿2021/07/04 08:28

編集2021/07/04 08:31
qryxip
qryxip

総合スコア0

良いと思った回答には高評価をしましょう。
評価が高い回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

2

&a[1..], &a[0..=1] のように書けます。

rust

fn main() { let a = vec![0, 1, 2]; // a[1:] 相当: &a[1..] assert_eq!(&a[1..], &[1, 2]); // a[0:1] 相当: &a[0..=1] assert_eq!(&a[0..=1], &[0, 1]); }

範囲記法は6種類あり、std::ops::Range のドキュメントに書いてあります。

rust

a[..] // 全て a[1..] // 1以上 a[..2] // 2未満 a[1..2] // 1以上2未満 a[..=2] // 2以下 a[1..=2] // 1以上2以下

a[1..2] などの式で得られるのは [T] 型の左辺値です。これをそのまま使うとコンパイルが通らないことが多く、 &a[..] の形で出てくることが多いです。

rust

fn main() { let a = [1,2,3][..]; //~^ERROR the size for values of type `[{integer}]` cannot be known at compilation time }

借用 (&[T]) ではなく所有権のある値 (Vec<T>) が欲しければ、 to_owned() などで取り出すことができます (要素のコピーが発生します)

rust

let b = a[1..2].to_owned();

投稿2021/07/04 08:07

qnighy
qnighy

総合スコア0

良いと思った回答には高評価をしましょう。
評価が高い回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

1

rust

fn main() { let v = vec![0, 1, 2]; let x = v.as_slice().get(1..).unwrap(); println!("{:?}", x); // [1, 2] let x = v.as_slice().get(0..=1).unwrap(); println!("{:?}", x); // [0, 1] }

こんな感じでどうでしょうか

投稿2021/07/04 07:11

TaniguchiTakaki
TaniguchiTakaki

総合スコア0

良いと思った回答には高評価をしましょう。
評価が高い回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。