Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 如何从先前选定范围的每个单元格中获取前3个单词?_Excel_Vba_Excel 2010 - Fatal编程技术网

Excel 如何从先前选定范围的每个单元格中获取前3个单词?

Excel 如何从先前选定范围的每个单元格中获取前3个单词?,excel,vba,excel-2010,Excel,Vba,Excel 2010,我真正需要的是从所选范围的每个单元格中取出前3个单词,然后将其设置在相同的位置(每个单元格),这样我就可以得到每个单元格中的前3个单词。以前有多少单词并不重要。基本上,我需要一个带有bucle的代码来处理选择中的每个单元格 我试着用当地的公式,但不起作用 Sub EXTRAER_NOMBRES_Y_APELLIDO() 'Convierte los textos seleccionados a formato de nombre propio 'La primera letra en mayús

我真正需要的是从所选范围的每个单元格中取出前3个单词,然后将其设置在相同的位置(每个单元格),这样我就可以得到每个单元格中的前3个单词。以前有多少单词并不重要。基本上,我需要一个带有bucle的代码来处理选择中的每个单元格

我试着用当地的公式,但不起作用

Sub EXTRAER_NOMBRES_Y_APELLIDO()
'Convierte los textos seleccionados a formato de nombre propio
'La primera letra en mayúscula y el resto en minúsculas
'Dim CELDA As String
'Dim B As Integer
For Each CELDA In Selection
    'CELDA.Value = Left(Range("Y3"), 5)
    'Range("Y3") = Left(Range("Y3"), 5)
    'CELDA.Value = Left(CELDA, 3)
    ActiveCell.FormulaLocal = "=LEFT(Planilla[@Estudiante];FIND(" ";Planilla[@Estudiante])-1)"
Next CELDA
End Sub
我希望得到的是列的每个单元格中的前3个单词(以前选择的范围)。

拆分名称 假设 每个单元格范围(人)有两个或三个姓名:

  • 中名
您希望将一列中的名称拆分为三列

代码
  • 调整常量部分中的值以满足您的需要
  • 如果需要,可以选择相同的列字母或数字 覆盖初始数据,但在测试代码后执行此操作

第二版
  • 调整常量部分中的值以满足您的需要
  • 如果需要,可以选择相同的列字母或数字 覆盖初始数据,但在测试代码后执行此操作

Sub-SplitNames2()
Const cSource As Variant=“A”'源列字母/编号
Const cTarget As Variant=“B”目标列字母/编号
Const cFirstR长度=7'源/目标第一行编号
Const cNum As Long=3'字数
作为变体的Dim VNT源阵列
Dim vntD作为变量的分隔数组
作为变型“目标阵列”的Dim vntT
Dim LastR为“长”源/目标最后一行号
Dim i As Long源/目标阵列行计数器
Dim j As Long“分隔数组行计数器
'计算源/目标最后一行号。
LastR=单元格(Rows.Count,cSource).End(xlUp).Row
'将源范围复制到源数组中。
vntS=范围(单元格(cFirstR,cSource),单元格(LastR,cSource))
'将目标阵列的行调整为源阵列,
ReDim vntT(1到UBound(vntS),1到1)
'从源阵列复制到目标阵列。
对于i=1到UBound(vntS)的源/目标数组行
vntD=Split(vntS(i,1))'分割源数组的每一行。
j=UBound(vntD)
如果j>cNum-1,则
j=cNum-1
如果结束
如果j-1那么
对于j=0到j
如果j>0,则
vntT(i,1)=vntT(i,1)&“和”vntD(j)
其他的
vntT(i,1)=vntD(j)
如果结束
下一个
如果结束
下一个
'将目标阵列复制到目标范围。
范围(单元格(cFirstR,cTarget),单元格(LastR,cTarget))=vntT
端接头

这是一份提案,使用基本Excel公式:

  • 用下划线替换第一个空格
  • 将第一个空格替换为下划线(因此,第一个空格和第二个空格都替换为下划线)
  • 确定第一个空格的位置(它给出了原始文本中第三个空格的位置)
  • n
    th字符左侧的文本
据此,公式(原始文本位于单元格
B2
):


请给出输入数据和期望结果的示例。由于输入数据不太可能是统一的(例如,有些人没有中间名),如果你可以发布一张10或15个不同名称的图片,并给出每个名称的预期结果,那就更好了。我真正需要的是从所选范围的每个单元格中取出前3个单词,然后将其设置在相同的位置(每个单元格),因此,每个单元格中的前3个单词都会结束。事实上,以前有多少单词并不重要。基本上,我需要一个带bucle的代码来处理选择中的每个单元格。@JUAN MORENO:你可以编辑你的问题。在你的帖子下面有一个编辑按钮。您应该将所有这些信息放在那里,并提供一个直观的示例。你现在可能已经得到3-5个答案了。我会在大约20分钟内准备好的。@JUAN MORENO:我在第一个版本的下面添加了第二个版本。@JUAN MORENO:您更改了cSource和cTarget了吗。对于最终版本,它们应该是相等的。请向我解释清楚,这些公式的作用以及代码应该是什么。
SUBSTITUTE
是将一个字符(本例中的空格)替换为另一个字符(本例中的下划线)。我这样做了两次,结果前两个空格被下划线取代。现在第一个空间实际上是第三个空间。使用
FIND
工作表函数,我找到了它的位置,最后我获取了该空间位置剩余的所有字符,这允许我找到我要查找的结果。
Sub SplitNames()

    Const cSource As Variant = "A"  ' Source Column Letter/Number
    Const cTarget As Variant = "B"  ' Target Column Letter/Number
    Const cFirstR As Long = 2       ' Source/Target First Row Number

    Dim vntS As Variant   ' Source Array
    Dim vntD As Variant   ' Delimited Array
    Dim vntT As Variant   ' Target Array
    Dim LastR As Long     ' Source/Target Last Row Number
    Dim i As Long         ' Source/Target Array Row Counter

    ' Calculate Source/Target Last Row Number.
    LastR = Cells(Rows.Count, cSource).End(xlUp).Row

    ' Copy Source Range into Source Array.
    vntS = Range(Cells(cFirstR, cSource), Cells(LastR, cSource))

    ' Resize Target Array's rows to the number of rows in Source Array,
    ' but to three columns: First, Middle, Last.
    ReDim vntT(1 To UBound(vntS), 1 To 3)

    ' Copy from Source Array to Target Array.
    For i = 1 To UBound(vntS)     ' Rows of Source/Target Array
        vntD = Split(vntS(i, 1))  ' Split each row of Source Array.
        vntT(i, 1) = vntD(0)      ' First Name
        If UBound(vntD) = 2 Then  ' Does have middle name.
            vntT(i, 2) = vntD(1)  ' Middle Name
            vntT(i, 3) = vntD(2)  ' Last Name
          Else                    ' Does not have middle name.
            vntT(i, 3) = vntD(1)  ' Last Name
        End If
    Next

    ' Copy Target Array into Target Range.
    Range(Cells(cFirstR, cTarget), Cells(LastR, cTarget)) _
            .Resize(UBound(vntT), UBound(vntT, 2)) = vntT

End Sub
Sub SplitNames2()

    Const cSource As Variant = "A"  ' Source Column Letter/Number
    Const cTarget As Variant = "B"  ' Target Column Letter/Number
    Const cFirstR As Long = 7       ' Source/Target First Row Number
    Const cNum As Long = 3          ' Number of Words

    Dim vntS As Variant   ' Source Array
    Dim vntD As Variant   ' Delimited Array
    Dim vntT As Variant   ' Target Array
    Dim LastR As Long     ' Source/Target Last Row Number
    Dim i As Long         ' Source/Target Array Row Counter
    Dim j As Long         ' Delimited Array Rows Counter

    ' Calculate Source/Target Last Row Number.
    LastR = Cells(Rows.Count, cSource).End(xlUp).Row

    ' Copy Source Range into Source Array.
    vntS = Range(Cells(cFirstR, cSource), Cells(LastR, cSource))

    ' Resize Target Array's rows to Source Array,
    ReDim vntT(1 To UBound(vntS), 1 To 1)

    ' Copy from Source Array to Target Array.
    For i = 1 To UBound(vntS)     ' Rows of Source/Target Array
        vntD = Split(vntS(i, 1))  ' Split each row of Source Array.
        j = UBound(vntD)
        If j > cNum - 1 Then
            j = cNum - 1
        End If
        If j <> -1 Then
            For j = 0 To j
                If j > 0 Then
                    vntT(i, 1) = vntT(i, 1) & " " & vntD(j)
                  Else
                    vntT(i, 1) = vntD(j)
                End If
            Next
        End If
    Next

    ' Copy Target Array into Target Range.
    Range(Cells(cFirstR, cTarget), Cells(LastR, cTarget)) = vntT

End Sub
B3 : =SUBSTITUTE(B2;" ";"_";1)
B4 : =SUBSTITUTE(B3;" ";"_";1)
B5 : =FIND(" ";B4)
B6 : =LEFT(B2;B5-1)